진짜 개발자
본문 바로가기

Language/Java

Java - 상속 super

728x90

super

- 부모객체를 지정하는 키워드 이다 


1. Class

1) Car

- Truck의 부모 클래스


2) Truck

- Car를 상속받는 자식 클래스



3) Main

- 테스트 클래스



2. super()

- 자식 객체의 생성자에서 부모 객체의 생성자를 호출할 때 사용하는 키워드이다.


1) super() 메소드 사용

Truck의 생성자에서 super(); 메소드를 사용한다


Car를 참조변수로 하여 Truck객체를 생성한다


Car생성자가 초기화 된 후 Truck의 생성자가 호출된것을 볼 수 있다.


! 이러면 어떻게 될까?

Truck을 참조변수로 하는 Truck을 생성한다


똑같은 결과가 나타난다


Car객체를 생성해본다


Car의 생성자만이 초기화 되었다.

=> 참조변수는 말그대로 객체의 레퍼런스가 담길 그릇만을 선언하고 

    실질적인 객체가 생성되고 레퍼런스를 리턴하는 것은 Truck() 메소드 이므로

    생성되는 객체에 따라 결과가 달라진다


2) super()를 사용하지 않음에도 부모 생성자가 호출이 된다?

Truck Class의 생성자에 super()를 없애본다


똑같은 결과가 나타난다


=> 자식 객체가 생성될 때에는 무조건 부모객체의 생성자를 먼저 초기화 한 후 자식객체가 생성된다

때문에 자식 Class의 생성자에 super()메소드가 없더라도 컴파일러가 자동으로 super()를 넣어 실행하게 된다

때문에 super()가 없더라도 부모의 생성자부터 초기화 된다

3) super()의 순서를 바꾸어본다

=> 앞서 말했듯이 부모의 생성자가 먼저 초기화 된 후 자식의 생성자가 초기화 되어야 하므로

컴파일러가 오류를 내뿜는것을 볼 수 있다.



3. super.부모의 메소드()

- 자식 클래스에서 메소드를 오버라이딩 했을 때 메소드가 덮어쓰기가 된다 다시말해 부모의 메소드를 

  새로 정의한다 하지만 경우에 따라 부모의 메소드가 필요할때가 있는데 super.부모의 메소드()를 이용하여

  부모의 메소드를 실행하도록 할 수 있다


1) 오버라이딩만 한 경우

Truck 객체를 생성하고 power() 메소드를 실행한다


자식 객체의 메소드만이 실행 되었다.

- 상속관계에 있어서 메소드는 가장 하위의 메소드를 호출한다


2) super.부모의 메소드() 이용

Truck 클래스에 super.power()를 추가한다


Car 클래스의 power()메소드가 실행된 후 Truck 클래스의 power()가 실행된다


3) 순서를 바꾸어 본다

생성자와 달리 생성 순서같은 것을 고려할 필요가 없으므로 컴파일 오류도 나타나지 않는다

실행 되는 순서가 바뀌었다




















'Language > Java' 카테고리의 다른 글

Java - 직렬화에 관해서(csv, json, java serializable)  (0) 2019.03.30
Java - JRE vs JDK  (0) 2019.01.08
Java - Call by Value와 Call by Reference  (0) 2018.12.14
Java - Static 이해  (0) 2018.10.28
Java - 초기화 순서  (0) 2018.10.28