SEB_BE_41

JAVA - 상속과 생성자

Greatshine 2022. 8. 1. 17:22

 

 

 

 

 

 

생성자의 기본적인 이해를 돕기 위한 로직들이다.

자바는 사용자가 다른 생성자를 정의하지 않았다면 자동으로 기본 생성자를 정의한다.

 

 

 

 

학습에서 계속 사용하고 있는 Calculator 클래스이다.

 

 

 

기존 Calulator클래스와의 다른 점은

Calulator클래스를 상속하는 SubtractionableCalculator클래스를 만들면서

setOprands메소드가 받던 left, right값을 SubtractionableCalculator클래스의 생성자가 받도록

로직을 변경한 것이다.

 

 

 

 

SubtractionableCalculator클래스를 인스턴스화 시키면서 값을 넣어주면

Calculator로직과 동일하게 작동하며 값은 30, 15, -10으로 출력된다.

만약 이 로직의 상위 클래스인 Calculator클래스의 생성자에 매개변수 값을 넣게 되면 어떻게 될까?

 

 

설명에 불필요한 부분은 주석처리 했다.

 

 

오류가 뜬다.

그 이유는 무엇일까??

하위 클래스는 생성자를 호출할 때 자동으로 상위 클래스의 기본 생성자를 호출하기 때문이다.

(마찬가지로 자식객체를 인스턴스화 시키면 자식객체의 생성자를 호출하기 전에

부모객체의 기본 생성자를 먼저 호출하기로 약속되어 있다.)

이 전의 로직에서 오류가 발생하지 않았던 것은 아무런 생성자를 정의하지 않았기 때문에

자바에서 자동으로 기본 생성자를 상위 클래스에 만들어줌으로써 하위 클래스가 그것을 호출했기 때문이다.

따라서 우리는 매개변수가 있는 생성자를 만들었다면 기본 생성자를 따로 정의해주면 된다.

 

 

기본 생성자를 정의해줌으로써 오류를 없앴다.

 

 

 

 

오류를 없앴지만 한 가지 불편한 점을 발견했다.

바로 left와 right의 값을 초기화하는 생성자가 상위 클래스에도 하위 클래스에도 존재하는 중복이 발생한 것이다.

이럴 때는 어떻게 해결할 수 있을까?

 

 

 

 

바로 super를 사용하는 것이다. 하위 클래스가 상위 클래스의 생성자를 참조하는 방법으로 super를 사용한다.

super라는 것은 상위클래스를 가리키는 키워드다. 즉, 부모클래스를 의미한다.

여기에 ()를 붙이면 부모클래스의 생성자를 의미하게 되고 

이렇게 하면 부모클래스의 기본 생성자가 없어져도 오류가 발생하지 않는다.

따라서 상위클래스에서만 초기화를 진행해도 하위클래스가 그 값을 받는 유기적인 로직을 만들 수 있게 된다.

 

하위 클래스에서 초기화를 진행해야 하고 super를 통해 상위 클래스의 생성자를 호출하고 있다면
super가 붙은 생성자 밑에 코드를 첨가함으로써 초기화를 진행할 수 있다.

이는 하위 클래스의 생성자에서 super를 사용한다면 super가 가장 먼저 나타나야 된다는 것을 의미하며
상위 클래스의 초기화가 끝난 상태에서만 하위 클래스의 초기화가 진행된다는 것을 의미한다.