자바에서 굉장히 중요한 개념인 상속의 기초적인 개념을 저번 글에서 다루었다.
https://changel.tistory.com/163
이어서 상속에서 부모를 부르는 예약어인 super에 대해 알아보자. 하위 클래스는 상위 클래스의 주소인 참조 값을 알고 있다.
이 참조 값을 가지고 있는 예약어가 바로 super이다! (this가 자기 자신의 참조 값을 가지고 있는 것과 같다고 생각하면 됨)
또, 상위 클래스의 생성자를 호출하는데도 사용된다.
상위 클래스 생성자 호출하기
지난 편에서 코드를 생성하고 확인한 결과 하위 클래스 생성자만 생성했는데 상위 클래스 생성자가 호출되는 것을 확인할 수 있었다.이는 하위 클래스 생성자에서 자동으로 super()을 호출하기 때문이다. 이것을 호출하면 상위 클래스의 디폴트 생성자가 호출된다. (컴파일러가 자동으로 추가해줌)
-super 예약어로 매개변수가 있는 생성자 호출하기
예를 들어 커스토머 클래스를 생성할 때 고객 아이디와 이름을 반드시 지정해야한다고 가정하자. 이런 경우 set() 메서드가 아니라 새로운 생성자를 만들어서 매개변수로 값을 받아야한다. 즉, 디폴트 생성자 ㄴ ㄴ 매개변수가 있는 생성자 ㅇ ㅇ를 직접 구현해야한다는 것!
근데 직접 해보면 커스토머 클래스를 상속받은 브이아이피 커스토머 클래스에서 오류가 생긴다. 이는 묵시적으로 호출될 디폴트 생성자인 customer()가 정의되지 않았기 떄문에 반드시 명시적으로 다른 생성자를 호출해야한다는 뜻이다.
커스토머 클래스를 생성할 때 고객 아이디와 이름을 반드시 지정하기로 했으므로 이를 상속받은 브이아이피 커스토머 클래스를 생성할 때에도 이 값이 필요하다. 그러면 기존 디폴트 생성자를 지우거나 주석처리하고 매개변수를 포함하는 생성자로 새로 작성하면 된다.
어찌됐건 이렇게 해서 코드를 실행해보면
1. 상위 클래스의 생성자가 먼저 실행되고 하위 클래스의 생성자가 순차적으로 실행된다.
2. 상위 클래스에 생성자 코드가 따로 없으면 super()로 상위 클래스의 디폴트 생성자가 자동으로 호출 된다.
3. 상위 클래스에 디폴트 생성자가 없고 매개변수가 있는 생성자만 있을 경우 super()에 매개변수를 추가하여, 매개변수가 있는 상위 클래스의 생성자를 직접 호출해야한다.
super()는 상위 클래스의 멤버 변수나 메서드를 참조한다.
-this를 사용하여 자신의 멤버에 접근했던 것 처럼말이다. 상위 클래스를 구현하려고 할때,
super.showCustomerInfo() + "~~~~" + agentID + "~~~"; <<<< 이런식으로 코드를 작성하여 이미 상위 클래스에 있는 메서드를 새로 구현하지 않고 활용할 수 있다는 뜻이다.
상위 클래스로 묵시적인 클래스 형 변환
상속을 공부하면서 중요하게 이해해야하는 관계가 바로 <클래스 간의 형 변환>이다.
개념 면에서 보면 상위 클래스가 하위 클래스보다 일반적인 개념이고, 기능 면에서 보면 하위 클래스가 상위 클래스보다 기능이 더 많다. 당연한 이야기이다. 상속받은 클래스는 상위 클래스 기능을 모두 사용하면서 추가로 더 많은 기능을 구현하기 때문이다.
따라서 하위 클래스는 하위 클래스 형이면서 동시에 상위 클래스형이기도 하다. 즉, 하위 클래스로 인스턴스를 생성할 때 이 인스턴스의 자료형을 상위 클래스의 자료형으로 클래스 형 변환하여 선언할 수 있다. 왜냐하면 하위 클래스는 상위 클래스를 상속받았기 때문이다.
이러한 클래스 형 변환을 업캐스팅이라고 한다.
상위 클래스형 vc = new 하위 클래스형();
이렇게 쓸 수 있다는 것...! 그러면 반대는 가능할까? 그건 ㄴㄴ 아니다. 상위 클래스는 하위 클래스의 기능을 다 가지고 있는게 아니기 때문이다. -> 당연함 ㅇㅇ.
즉, 모든 하위 클래스는 상위 클래스 자료형으로 형변환될 수 있지만, 그 역은 성립하지 않는다.
위와같이 선언했다고 할때 문장이 실행되면 하위 클래스 생성자가 호출되므로 상위 클래스 생성자가 먼저 호출되고 하위 클래스 생성자가 다음으로 호촐되는 메모리 구조를 가진다.
그런데, 클래스 자료형이 상위 클래스로 한정되었으므로 클래스가 형변환이 되었을 경우에는 선언한 클래스형에 기반하여 멤버 변수와 메서드에 접근할 수 있다. 따라서 이렇게 선언한 참조변수가 가리킬 수 있는 변수와 메서드는 상위 클래스의 멤버 뿐이다! 직접 컨트롤과 스페이스바를 눌러서 참조변수가 접근 가능한 변수와 메서드를 확인해보자.
아무튼 기억할 점: 하위 클래스의 인스턴스가 상위 클래스로 형 변환되는 과정이 묵시적으로 이루어진다.
+ 클래스의 상속 계층 구조가 여러 단계일 경우에도 묵시적으로 형 변환은 이루어진다.
다음은 메서드 오버라이딩에대해 공부하도록 하자 ->
'공부 STUDY > JAVA' 카테고리의 다른 글
[JAVA] 상속 | 다형성(Polymorphism) (0) | 2023.01.08 |
---|---|
[JAVA] 상속 | 메서드 오버라이딩 (0) | 2023.01.08 |
[Java] 상속 inheritance, 클래스 생성과 형변환 | 예제를 통해 이해하기 (0) | 2023.01.08 |
[JAVA] 싱글톤 패턴(Singleton Pattern) - static 응용 (0) | 2023.01.07 |
JAVA 2회독 시작 기록 (0) | 2023.01.03 |