super
와 super()
super
: 부모의 필드나 메서드에 접근super
는 자식 클래스에서 부모 클래스의 멤버(필드나 메서드)에 접근할 때 사용한다. 자식 클래스에서 부모 클래스의 필드나 메서드가 자식 클래스에서 같은 이름으로 오버라이딩되었을 때, super
를 사용하여 부모 클래스의 원본 멤버에 접근할 수 있다.
super
로 부모 메서드 호출class Parent {
void display() {
System.out.println("부모 클래스의 display()");
}
}
class Child extends Parent {
void display() {
System.out.println("자식 클래스의 display()");
super.display(); // 부모 클래스의 display() 호출
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
c.display();
}
}
출력:
자식 클래스의 display()
부모 클래스의 display()
super
로 부모 필드 접근class Parent {
String name = "Parent Name";
}
class Child extends Parent {
String name = "Child Name"; // 부모 필드를 오버라이딩
void showName() {
System.out.println("자식 클래스 필드: " + this.name); // 자식 필드
System.out.println("부모 클래스 필드: " + super.name); // 부모 필드
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
c.showName();
}
}
출력:
자식 클래스 필드: Child Name
부모 클래스 필드: Parent Name
super()
: 부모 생성자 호출super()
는 부모 클래스의 생성자를 호출하는 역할을 한다. 자식 클래스의 생성자에서 부모 클래스의 생성자를 명시적으로 호출할 때 사용한다. 자식 클래스의 생성자가 호출되면 먼저 부모 클래스의 생성자가 실행되어야 부모 클래스의 필드가 올바르게 초기화된다.
super(매개변수)
형식으로 명시적으로 호출해야 한다.super()
는 생략할 수 있다. 그러나 부모 클래스에 기본 생성자가 없거나, 매개변수가 있는 생성자를 호출해야 하는 경우에는 반드시 명시적으로 super()
를 사용해야 한다.super()
기본 사용class Parent {
Parent() {
System.out.println("Parent 생성자 호출");
}
}
class Child extends Parent {
Child() {
super(); // 부모 클래스의 기본 생성자 호출
System.out.println("Child 생성자 호출");
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
}
}
출력:
Parent 생성자 호출
Child 생성자 호출
super()
호출class Parent {
Parent(String name) {
System.out.println("Parent 생성자 호출: " + name);
}
}
class Child extends Parent {
Child() {
super("홍길동"); // 부모 클래스의 매개변수 생성자 호출
System.out.println("Child 생성자 호출");
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
}
}
출력:
Parent 생성자 호출: 홍길동
Child 생성자 호출
super()
와 this()
의 차이점this()
: 같은 클래스 내의 다른 생성자를 호출할 때 사용됨.super()
: 부모 클래스의 생성자를 호출할 때 사용됨.class Parent {
Parent(String name) {
System.out.println("Parent 생성자 호출: " + name);
}
}
class Child extends Parent {
Child() {
this("Child 호출"); // 같은 클래스의 다른 생성자 호출
}
Child(String name) {
super(name); // 부모 클래스의 생성자 호출
System.out.println("Child 생성자 호출: " + name);
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
}
}
출력:
Parent 생성자 호출: Child 호출
Child 생성자 호출: Child 호출
super()
: 부모 클래스의 생성자를 호출한다. 자식 클래스의 생성자에서 부모 클래스의 디폴트 또는 매개변수 생성자를 호출할 때 사용한다.
super
: 부모 클래스의 필드나 메서드에 접근할 때 사용한다. 자식 클래스에서 오버라이딩된 메서드나 필드를 호출할 때 유용하다.
- 부모 클래스의 생성자는 항상 자식 클래스 생성자에서 먼저 호출되므로, 자식 클래스의 생성자 첫 줄에서
super()
를 사용해 부모 생성자를 명시적으로 호출할 수 있다.