개발 일지/Java

[Java] super과 super()

미숫가루설탕많이 2022. 12. 29. 16:24

 super 키워드와 super() 메서드는 this 키워드와 this() 메서드의 관계와 비슷하다고 할 수 있다.

 

 super 키워드는 상위 클래스의 객체, super() 메서드는 상위 클래스의 생성자를 호출하는 것을 의미한다. 여기서, 모두 상위 클래스의 존재를 상정하며 상속 관계를 전제로 한다.

 

 

 

 

super


public class HelloJava {
    public static void main(String[] args) {
        SubClass subClassInstance = new SubClass();
        subClassInstance.callNum();
    }
}

class SuperClass {
    int count = 1;
}

class SubClass extends SuperClass {
    int count = 2;

    void callNum() {
        System.out.println("count = " + count);
        System.out.println("this.count = " + this.count);
        System.out.println("super.count = " + super.count);
    }
}

 

 위 코드를 보면 SubClass 클래스는 SuperClass 클래스로부터 변수 count를 상속받는데, 자신의 인스턴스 변수 count와 이름이 같아서 둘을 구별할 방법이 필요하다.

 

 이런 경우에 사용하는 것이 바로 super 키워드이다. 만약 super 키워드를 붙이지 않는다면, 자바 컴파일러는 해당 객체는 자신이 속한 인스턴스 객체의 멤버를 먼저 참조한다.

 

  • 코드 하단에서 첫 번째 count는 SubClass의 count 변수, 즉 2를 가리킨다.
  • 두 번째 count는 자신이 호출된 객체의 인스턴스 변수를 가리키기 때문에 2를 출력한다.
  • 세 번째 count는 super 키워드를 사용하여 호출했기 때문에 상위 클래스의 변수를 참조하여 1을 출력한다.

 

 

 

 

super()


 supur() 메서드도 this() 메서드처럼 생성자를 호출할 때 사용한다. 다만 상위 클래스의 생성자를 호출한다는 점에서 차이가 있다.

 

public class HelloJava {
    public static void main(String[] args) {
        Dog d = new Dog();
    }
}

class Animal {
    Animal() {
        System.out.println("Animal 클래스 생성자");
    }
}

class Dog extends Animal {
    Dog() {
        super();
        System.out.println("Dog 클래스 생성자");
    }
}

 

 위 코드에서, super() 메서드는 Dog 클래스 내부에서 호출되고 있고 상위 클래스 Animal 클래스의 생성자를 호출하고 있다.

 

 super() 메서드 또한 this()와 마찬가지로 생성자 안에서만 사용 가능하고, 모든 생성자의 첫 줄에는 반드시 super() 메서드나 this() 메서드가 선언되어야 한다.

 

 만약 super() 메서드가 없는 경우에는 컴파일러가 생성자의 첫 줄에 자동으로 super()를 삽입한다. 이때, 상위 클래스에 기본 생성자가 없으면 에러가 발생하게 된다.

'개발 일지 > Java' 카테고리의 다른 글

[Java] 캡슐화(Encapsulation)  (0) 2022.12.29
[Java] Object 클래스  (0) 2022.12.29
[Java] 메서드 오버라이딩(Method Overriding)  (0) 2022.12.29
[Java] 상속/포함 관계  (0) 2022.12.29
[Java] 상속(Inheritance)  (0) 2022.12.29