일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 졸리다
- 문자 단위 스트림
- MPA
- 자바
- 새벽공부
- 백엔드
- try-catch
- Java
- SSR
- FileInputStream
- 바이트 단위 스트림
- 다형성
- 초보개발자
- 변수
- exception
- 예외 처리
- 인스턴스
- 개발자
- 메서드
- 배열
- throws
- 코딩
- 상속
- 인터페이스
- node.js
- 자료형
- 보조 스트림
- 파이팅
- ArrayList
- 코린이
- Today
- Total
SHUSTORY
08-2 상속에서 클래스 생성과 형 변환 본문
하위 클래스가 생성되는 과정
하위 클래스가 생성될 때는 상위 클래스의 생성자가 먼저 호출된다.
상속을 받은 하위 클래스는 상위 클래스의 변수와 메서드를 사용할 수 있다.
변수를 사용할 수 있다는 것은 그 변수를 저장하고 있는 메모리가 존재한다는 의미이다.
그런데 VIPCustomer 클래스를 보면 해당 변수가 존재하지 않은 것을 볼 수 있다.
단지 Customer 클래스를 상속받았을 뿐인데 어떻게 변수를 사용할 수 있는 것인지에 대해
상속된 하위 클래스가 생성되는 과정을 통해 이해해보자.
Customer( ) 디폴트 생성자와 VIPCustomer( ) 디폴트 생성자가 호출될 때 호출되었음을 출력하는 출력문을 작성하였다.
CustomerTest2 클래스를 실행하여 출력 결과를 확인해보자.
예제01 출력 결과를 통해 확인할 수 있듯이, 상위 클래스의 Customer( ) 생성자가 먼저 호출되고
그 후에 VIPCustomer( ) 생성자가 호출된다.
상위 클래스를 상속받은 하위 클래스가 생성될 때는 반드시 상위 클래스의 생성자가 먼저 호출되는 것이다.
그리고 상위 클래스 생성자가 호출될 때 상위 클래스의 멤버 변수가 메모리에 생성되고,
하위 클래스 생성자가 호출될 때 하위 클래스의 (추가적인) 멤버 변수가 메모리에 생성된다.
즉 상위 클래스의 변수가 메모리에 먼저 생성되기 때문에 하위 클래스에서도 이 값들을 모두 사용할 수 있다.
* 만약 상위 클래스의 변수가 private으로 선언되어 있다면 하위 클래스의 생성자가 호출될 때
상위 클래스의 private 변수가 생성되지 않았기 때문이 아닌, 단지 하위 클래스에서 접근할 수 없기 때문이다.
부모를 부르는 예약어, super
super 예약어는 하위 클래스에서 상위 클래스로 접근할 때 사용한다.
하위 클래스는 상위 클래스의 주소( 참조값 )를 알고 있다.
이 참조값을 가지고 있는 예약어가 바로 super이다.
또한 super는 상위 클래스의 생성자를 호출하는 데도 사용한다.
상위 클래스 생성자 호출하기
예제01에서 VIPCustomer만 생성하였는데 Customer 상위 클래스도 생성된 것을 볼 수 있었다.
하위 클래스 생성자를 호출하면 상위 클래스 생성자가 호출되는데
이는 하위 클래스 생성자가 자동으로 super( )를 자동으로 호출하기 때문이다.
super( )를 호출하면 상위 클래스의 디폴트 생성자가 호출된다.
하위 클래스의 디폴트 생성자는 바이트 코드로 변환되기 전에 자동으로 super( ); 코드가 삽입되어 변경된다.
* 컴파일러가 자동으로 추가하는 것이다.
super 예약어로 매개변수가 있는 생성자 호출하기
그런데 만약 Customer 클래스를 생성할 때 고객 ID와 이름을 필수로 지정해야 할 경우에는
set( ), get( ) 메서드를 사용하는 것이 아닌 새로운 생성자를 만들어서 매개변수로 값을 전달받아야 한다.
다음은 매개변수를 받는 생성자를 구현하고 디폴트 생성자를 삭제한 Customer 클래스이다.
이렇게 디폴트 생성자를 삭제하면 Customer 클래스를 상속받은 VIPCustomer 클래스는 오류가 발생한다.
묵시적으로 호출될 디폴트 생성자 Customer( )가 정의되지 않았기 때문에,
반드시 명시적으로 다른 생성자를 호출해야 한다는 뜻이다.
다음은 VIPCustomer 클래스의 디폴트 생성자도 지운 후 필요한 매개변수를 포함하는 생성자를 새로 작성한 것이다.
8행을 통해 상위 클래스 생성자를 호출하고 코드 순서대로 멤버 변수가 초기화된다.
예제02는 수정된 코드에 맞추어 다시 테스트 코드를 수행한 결과이다.
상위 클래스의 멤버 변수나 메서드를 참조하는 super
상위 클래스에 선언한 멤버 변수나 메서드를 하위 클래스에서 참조할 때도 super를 사용한다.
this를 사용하여 자신의 멤버에 접근했던 것과 비슷한 개념이다.
만약 VIPCustomer 클래스의 showVIPInfo( ) 메서드를 참조해
담당 상담원 아이디를 추가로 출력하려고 할 때 다음과 같이 구현할 수 있다.
위 코드에서는 사실 굳이 super.showCustomerInfo( )라고 호출하지 않아도 상위 클래스의 메서드가 잘 호출된다.
하위 클래스가 상위 클래스와 동일한 이름의 메서드를 구현하는 경우도 있는데,
이 경우 하위 클래스에서 동일한 이름의 상위 클래스 메서드 이름을 가리킬 때 super.showCustomerInfo( )라고 작성한다.
상위 클래스로 묵시적 클래스 형 변환
상속받은 클래스는 상위 클래스 기능을 모두 사용할 수 있고 추가로 더 많은 기능을 구현한다.
즉 VIPCustomer는 VIPCustomer형이면서 동시에 Customer형이기도 하다.
즉 VIPCustomer 클래스로 인스턴스를 생성할 때
이 인스턴스의 자료형을 Customer형으로 클래스 형 변환하여 선언할 수 있다.
하지만 상위 클래스가 하위 클래스의 기능을 다 가지는 것은 아니기 때문에 역은 성립하지 않는다.
형 변환된 vc가 가리키는 것
위 업캐스팅 문장이 실행되면 VIPCustomer 생성자가 호출되는데,
클래스의 자료형이 Customer로 한정되었다.
클래스가 형 변환이 되었을 때는 선언한 클래스형에 기반하여 멤버 변수와 메서드에 접근할 수 있다.
즉 vc 참조 변수가 가리킬 수 있는 변수와 메서드는 Customer 클래스의 멤버뿐이다.
* 이클립스에서 Ctrl+Spacebar를 눌러 보면 vc 참조 변수가 접근할 수 있는 변수와 메서드가 나타난다.
'프로그래밍 > JAVA' 카테고리의 다른 글
08-4 다형성 (1) | 2023.02.25 |
---|---|
08-3 메서드 오버라이딩 (0) | 2023.02.25 |
08-1 상속 (0) | 2023.02.25 |
07-3 ArrayList 클래스 사용하기 (0) | 2023.02.25 |
07-2 다차원 배열 (0) | 2023.02.25 |