Java에서 `super` 키워드는 클래스 상속과 관련하여 부모 클래스(슈퍼클래스)의 멤버(필드, 메서드)를 참조하거나 부모 클래스의 생성자를 호출할 때 사용됩니다. `super` 키워드는 자식 클래스(서브클래스)에서 부모 클래스의 기능을 확장하거나 재사용할 때 매우 유용합니다. 아래에서는 `super` 키워드의 사용법과 예제를 통해 자세히 설명하겠습니다.
### 1. 기본 개념
#### 1.1 부모 클래스(슈퍼클래스)와 자식 클래스(서브클래스)
자바에서 클래스는 다른 클래스를 상속받을 수 있습니다. 이때 상속받는 클래스는 '자식 클래스' 혹은 '서브클래스'라 불리며, 상속해주는 클래스는 '부모 클래스' 혹은 '슈퍼클래스'라고 합니다. 상속을 통해 자식 클래스는 부모 클래스의 필드와 메서드를 물려받아 사용할 수 있습니다.
#### 1.2 super 키워드
`super`는 자식 클래스에서 부모 클래스의 멤버를 참조할 때 사용합니다. 주로 다음과 같은 경우에 사용됩니다:
1. 부모 클래스의 멤버 변수(필드)에 접근할 때
2. 부모 클래스의 메서드를 호출할 때
3. 부모 클래스의 생성자를 호출할 때
### 2. super의 사용법
#### 2.1 부모 클래스의 필드 참조
자식 클래스에서 부모 클래스와 동일한 이름의 필드를 가질 때 `super`를 사용하여 부모 클래스의 필드에 접근할 수 있습니다.
```java
class Parent {
int num = 100;
}
class Child extends Parent {
int num = 200;
void display() {
System.out.println("Child num: " + num);
System.out.println("Parent num: " + super.num);
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display();
}
}
```
이 예제에서 `Child` 클래스는 `Parent` 클래스와 같은 이름의 `num` 필드를 가지고 있습니다. `super.num`을 사용하여 부모 클래스의 `num` 필드에 접근할 수 있습니다.
#### 2.2 부모 클래스의 메서드 호출
자식 클래스에서 부모 클래스와 동일한 이름의 메서드를 가질 때 `super`를 사용하여 부모 클래스의 메서드를 호출할 수 있습니다.
```java
class Parent {
void display() {
System.out.println("Display method in Parent class");
}
}
class Child extends Parent {
void display() {
System.out.println("Display method in Child class");
super.display();
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display();
}
}
```
이 예제에서 `Child` 클래스는 `Parent` 클래스와 동일한 이름의 `display` 메서드를 오버라이드합니다. `super.display()`를 사용하여 부모 클래스의 `display` 메서드를 호출할 수 있습니다.
#### 2.3 부모 클래스의 생성자 호출
자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때 `super`를 사용할 수 있습니다. 이는 주로 부모 클래스에서 초기화가 필요한 멤버 변수를 초기화하기 위해 사용됩니다.
```java
class Parent {
Parent() {
System.out.println("Parent class constructor");
}
Parent(String msg) {
System.out.println("Parent class constructor with message: " + msg);
}
}
class Child extends Parent {
Child() {
super("Hello from Child");
System.out.println("Child class constructor");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
}
}
```
이 예제에서 `Child` 클래스의 생성자는 `super("Hello from Child")`를 통해 부모 클래스의 생성자 `Parent(String msg)`를 호출합니다.
### 3. 예제 및 심화
#### 3.1 구체적인 예제
```java
class Animal {
String name;
Animal(String name) {
this.name = name;
}
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
Dog(String name) {
super(name); // 부모 클래스의 생성자 호출
}
@Override
void sound() {
super.sound(); // 부모 클래스의 sound 메서드 호출
System.out.println(name + " barks");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Buddy");
dog.sound();
}
}
```
이 예제에서 `Dog` 클래스는 `Animal` 클래스를 상속받습니다. `Dog` 클래스의 생성자는 부모 클래스의 생성자를 호출하여 `name`을 초기화합니다. `sound` 메서드를 오버라이드하고 `super.sound()`를 통해 부모 클래스의 `sound` 메서드를 호출합니다.
#### 3.2 심화: super 키워드의 중요성
`super` 키워드는 객체 지향 프로그래밍에서 매우 중요합니다. 이를 통해 자식 클래스는 부모 클래스의 메서드와 필드를 재사용하고 확장할 수 있습니다. 또한, 코드의 중복을 줄이고 유지보수를 쉽게 만들어줍니다.
예를 들어, 큰 프로젝트에서 여러 클래스가 공통된 기능을 공유해야 할 때, 부모 클래스에 공통 기능을 구현하고 자식 클래스에서 이를 재사용할 수 있습니다. 이는 코드의 일관성을 유지하고 오류를 줄이는 데 도움이 됩니다.
### 4. 결론
`super` 키워드는 자바의 상속 메커니즘에서 중요한 역할을 합니다. 이를 통해 자식 클래스는 부모 클래스의 필드와 메서드를 참조하고, 부모 클래스의 생성자를 호출할 수 있습니다. `super`를 사용하면 코드의 재사용성과 유지보수성을 높일 수 있으며, 객체 지향 프로그래밍의 원칙을 따르는 데 큰 도움이 됩니다. 다음은 `super` 키워드를 사용하는 주요 상황을 요약한 것입니다:
1. **부모 클래스의 필드 참조**: 자식 클래스와 부모 클래스가 동일한 이름의 필드를 가질 때, 부모 클래스의 필드를 참조할 수 있습니다.
2. **부모 클래스의 메서드 호출**: 자식 클래스에서 부모 클래스와 동일한 이름의 메서드를 오버라이드할 때, 부모 클래스의 메서드를 호출할 수 있습니다.
3. **부모 클래스의 생성자 호출**: 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출하여 부모 클래스의 초기화 과정을 재사용할 수 있습니다.
이러한 사용법을 잘 이해하고 활용하면, 더 효율적이고 유지보수하기 쉬운 객체 지향 프로그램을 작성할 수 있습니다.