하루하루 살아남기

[Java / 자바 ] Super 본문

개발/Java

[Java / 자바 ] Super

막막이 2021. 3. 25. 00:39
반응형

여기 동물 클래스가 있습니다.

 

public class Animal {
    
    public Animal() {
        System.out.println("동물클래스입니다.");
    }
    
}

 

이 동물 클래스를 상속받는 Dog 클래스를 만들겠습니다.

 

public class Dog extends Animal {
    
    public Dog () {
        System.out.println("개입니다.");
    }
    
}

 

Dog클래스의 인스턴스를 만들고 실행해보겠습니다.

 

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

실행결과

 

분명 Dog클래스를 만들었는데, 부모클래스인 동물클래스 생성자의 내용이 출력됩니다. 순서또한 동물클래스가 실행되고 Dog클래스가 실행됩니다. 이 이유는 Dog클래스가 인스턴스화 될때는 부모인 Animal클래스도 인스턴스화 됩니다

Animal클래스가 생성돼야만 Dog 클래스가 생성되기 때문입니다. 

 

생성자는 객체를 초기화합니다. 생성자가 호출될 때 부모의 생성자가 호출되면서 부모 객체를 초기화합니다. 부모의 생성자를 호출할 때는 부모 객체를 초기화하는 super 키워드를 사용합니다. super()를 사용하여 부모 생성자가 호출됩니다. Dog 클래스의 생성자가 호출됐을 때 컴파일러가 부모의 기본 생성자를 호출하는 명령을 자동으로 추가합니다. 자동으로 추가된 코드는 다음과 같습니다. 

 

public class Dog extends Animal {

    public Dog () {
        super();
        System.out.println("개입니다.");
    }

}

 

자동으로 super()를 추가해주는데 super 키워드를 알아야 하는 이유는 다음과 같습니다. 먼저 Animal클래스의 기본 생성자를 동물 이름을 받는 생성자로 바꾸어 주겠습니다.

 

public class Animal {

    public Animal(String animalName) {
        System.out.println("동물클래스입니다. 이름은 " + animalName + " 입니다");
    }

}

 

그리고 다시 Dog 클래스로 가보면 다음과 같은 에러가 발생합니다

 

 

개 객체가 생성되려면 부모객체가 먼저 생성되야 하는데 부모의 생성자를 직접 호출하지않으면 컴파일러는 항상 기본 생성자만을 호출합니다. 그런데 기본생성자가 없으므로 Dog클래스에 에러가 발생한 것입니다. 이때는 프로그래머가 직접 super키워드를 통해 생성자를 호출해 주어야 합니다.

 

 

 

정리

this = 자기 자신을 가르키는 키워드

super = 부모를 가르키는 키워드

728x90
반응형

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

[Java / 자바 ] 클래스 형변환  (0) 2021.03.27
[ Java / 자바 ] 오버라이딩  (0) 2021.03.26
[Java / 자바] 추상 클래스  (0) 2021.03.23
[Java / 자바] 접근제한자  (0) 2021.03.19
[Java / 자바 ] 상속  (0) 2021.03.17
Comments