언어(Language)/Java

[Java] 자바 super() vs super

잇트루 2022. 9. 16. 02:00
반응형

super()와 super

super() 메서드와 super는 공통적으로 모두 상위 클래스의 존재를 상정하며 상속 관계를 전제로 사용한다. super() 메서드는 상위 클래스의 생성자를 호출하며, spuer는 상위 클래스의 객체를 호출한다.

 

super()

this()와 유사하게 생성자 안에서만 사용 가능하며 반드시 첫 줄에 작성해야 한다.

만약 첫 줄에 super()가 없는 경우, 컴파일러가 생성자의 첫 줄에 자동으로 super()를 삽입하여 실행한다. 이때, 상위 클래스에 기본 생성자가 없으면 에러가 발생하므로 주의해야 한다.

따라서, 클래스를 만들 때 기본 생성자를 작성하는 습관을 들이는 것이 좋다.

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

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

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

 

super

super는 상속 관계의 인스턴스 변수가 같은 이름의 변수일 때 이를 구분하기 위해 사용한다. 만약, super 키워드를 사용하지 않으면, 자바 컴파일러는 해당 객체는 자신이 속한 인스턴스 객체의 멤버를 먼저 호출하게 된다.

따라서 상위 클래스의 변수를 참조해야 할 경우 super 키워드를 통해 상위 클래스 객체의 멤버 값을 사용할 수 있다.

super와 this의 차이점

super는 상위 클래스 객체의 멤버 값을 참조하기 위해 사용한다.

this는 인스턴스 변수와 매개 변수를 구분하기 위해 사용하며 자기 자신을 지칭한다.

public class Super {
    public static void main(String[] args) {
        Child me = new Child();
        me.PrintMe();
    }
}

class Parents {
    String me = "Parents";
}

class Child extends Parents {
    String me = "Child";

    void PrintMe() {
        System.out.println(super.me); // Parents
        System.out.println(this.me); // Child
    }
}

 

반응형