
✅ 참고
super를 정확하게 이해하려면 클래스의 상속 관계에 대한 이해가 필요합니다.
Super
Java에서 super는 상속 관계에서 자식 클래스가 부모 클래스에 접근 하기 위해 사용 되는 키워드(예약어)입니다.
super - 부모 참조
super가 필요한 이유
부모와 자식의 필드명이 같거나 메서드가 오바라이딩 되어 있으면, 자식에서 부모의 필드나 메서드를 호출할 수 없습니다.
이때 super 키워드를 사용하면 부모를 참조할 수 있습니다.
아래 코드를 살펴봅시다.
부모 클래스의 필드명과 자식 클래스의 필드명이 둘다 value로 똑같습니다.
부모 클래스의 메서드 hello()도 자식 클래스에서 오버라이딩 되어 있습니다.
이때 자식 클래스에서 부모 클래스의 value와 hello()를 호출하고 싶다면 super 키워드를 사용하면 됩니다.
Parent.java(부모 클래스)
public class Parent {
public String value = "parent";
public void hello() {
System.out.println("Parent.hello");
}
}
Child.java(자식 클래스)
public class Child extends Parent{
public String value = "child";
@Override
public void hello() {
System.out.println("Child.hello");
}
public void call() {
System.out.println("this value = " + this.value); // this 생략 가능
System.out.println("super value = " + super.value);
// hello() // Child.hello 출력
this.hello(); // this 생략 가능
super.hello();
}
}
참고: call() 메서드에서 hello()를 호출하게 되면 자동으로 this가 생략되므로 Child.hello가 출력됩니다.
SuperMain.java
자식 클래스의 객체를 생성하고 call() 메서드를 호출합니다.
public class SuperMain {
public static void main(String[] args) {
Child child = new Child();
child.call();
}
}
실행 결과
this value = child
super value = parent
Child.hello
Parent.hello
실행 결과를 보면 super를 사용한 경우 자식 클래스가 부모 클래스의 기능을 사용한 것을 확인할 수 있습니다.
그러한 이유는 자식 클래스의 객체가 생성될 때,
생성된 자식 인스턴스가 부모 클래스의 변수와 메서드 정보를 포함하여 생성되기 때문입니다.
SuperMain.java의 메모리 구조
Child 인스턴스가 Parent 클래스의 변수와 메서드 정보를 포함하여 메모리에 할당되었습니다.

super - 생성자
생성자에서 super가 필요한 이유
상속 관계의 인스턴스를 생성하면 결국 메무리 내부에는 자식과 부모 클래스가 각각 만들어집니다.
따라서 각각의 생성자도 모두 호출 되어야 합니다.
상속 관계에서는 자식 클래스의 생성자에서 부모클래스의 생성자를 반드시 호출해야 합니다.
상속 관계에서 부모의 생성자를 호출할 때는 super(...)를 사용하면 됩니다.
아래 코드를 통해 상속 관계에서 생성자를 어떻게 사용하는지 알아봅시다.
classA는 최상위 부모 클래스입니다.
public class ClassA {
public ClassA() {
System.out.println("ClassA 생성자");
}
}
ClassB는 ClassA를 상속 받았습니다.
그렇기 때문에 ClassB에서는 ClassA의 생성자를 super(...)를 통해 호출해야 합니다.
public class ClassB extends ClassA{
public ClassB(int a) {
super(); // 기본 생성자 생략 가능
System.out.println("ClassB 생성자 a=" + a);
}
public ClassB(int a, int b) {
super(); // 기본 생성자 생략 가능
System.out.println("ClassB 생성자 a=" + a + "b=" + b);
}
}
참고: 부모 클래스의 생성자가 기본 생성자(파라미터가 없는 생성자)인 경우에는 super()를 생략할 수 있습니다.
상속 관계에서 첫줄에 super(...)를 생략하면 자바는 부모의 기본 생성자를 호출하는 super()를 자동으로 만들어줍니다.
ClassC는 ClassB를 상속 받았습니다.ClassB는 2개의 생성자가 있습니다.
생성자는 하나만 호출할 수 있습니다. 두 생성자 중에 하나를 선택하면 됩니다.
public class ClassC extends ClassB {
public ClassC() {
super(10, 20);
System.out.println("ClassC 생성자");
}
}
참고: ClassC의 부모인 ClassB에는 기본 생성자가 없습니다.
따라서 부모의 기본 생성자를 호출하는 super()를 사용하거나 생략할 수 없습니다.
ClassC의 객체를 생성하고 실행 결과를 확인해 봅니다.
public class Super2Main {
public static void main(String[] args) {
ClassC classC = new ClassC();
}
}
실행 결과
ClassA 생성자
ClassB 생성자 a=10 b=20
ClassC 생성자
실행해보면 ClassA -> ClassB -> ClassC 순서로 실행됩니다.
그러한 이유는 자식 생성자의 첫줄에서는 부모 생성자를 호출하며,
ClassC는 부모인 ClassB를 호출하고, ClassB는 부모인 ClassA를 호출하기 때문입니다.
즉, 초기화는 최상위 부모부터 이루어집니다.
아래 그림에서 1~6번 까지의 실행 순서를 참고해 주세요.

'JAVA & Spring' 카테고리의 다른 글
[Java] static변수와 static메서드 총 정리(+그림&코드) (0) | 2025.01.22 |
---|---|
[Java] 자바 메모리 구조 총 정리(+그림) (0) | 2025.01.21 |
[Java] 로또 번호 자동 생성기 (+코드) (0) | 2024.12.01 |
[Spring] QueryDSL 설정 총 정리 (build.gradle) (0) | 2024.11.24 |
[Java] 인수(Argument)란? 매개변수(Parameter)란? 아주 쉽게 정리(+코드) (0) | 2024.10.23 |
댓글