7.3 부모 클래스와 자식 클래스의 생성자
- new에 의해 자식 클래스의 객체가 생성될 때
- 부모 클래스 생성자와 자식 클래스 생성자 모두 실행됨
- 호출 순서: 자식 클래스의 생성자 호출 → 자식 클래스 생성자 실행 전 부모 클래스 생성자 호출
- 실행 순서: 부모 클래스의 생성자 실행 → 자식 클래스의 생성자 실행
- 부모 클래스와 자식 클래스의 생성자 조합
- 컴파일러가 자식 클래스의 생성자를 기준으로 부모 클래스의 생성자를 찾는 경우: 1,3
- 개발자가 자식 클래스의 생성자에 부모 클래스의 짝을 지정해야 하는 경우: 2,4 → super() 키워드 이용
경우 |
1 |
2 |
3 |
4 |
자식 클래스 |
기본 생성자 |
기본 생성자 |
매개 변수를 가진 생성자 |
매개 변수를 가진 생성자 |
부모 클래스 |
기본 생성자 |
매개 변수를 가진 생성자 |
기본 생성자 |
매개 변수를 가진 생성자 |
- super(): 자식 클래스에서 명시적으로 부모 클래스의 생성자를 선택 호출할 때 사용
- 사용 방식: super(매개 변수), 인자를 이용하여 부모 클래스의 적당한 생성자 호출, 반드시 자식 클래스 생성자 코드의 가장 첫 줄에 와야함
- 둘다 기본 생성자인 경우: 자식 클래스의 생성자가 기본인 경우 컴파일러가 자동으로 부모 클래스의 기본 생성자 호출됨
- 자식 클래스의 기본 생성자를 호출했을 때, 부모 클래스의 기본 생성자가 정의되어 있지 않는 경우 → 컴파일 에러
- 자식 클래스의 매개 변수가 있는 생성자는 부모 클래스의 기본 생성자와 짝을 이룸
(1) 클래스 들의 관계
- is-a(상속 관계): extends 키워드를 이용해 클래스를 상속 받은 것
- has-a(소유 관계): 어떤 클래스가 다른 클래스의 필드로서 있을 때
7.4 메소드 오버라이딩
(1) 메소드 오버라이딩
- 메소드 오버라이딩(Method Overriding): 물러 받은 메소드를 자식 클래스에게 맞도록 재정의
- 동적 바인딜 발생: 오버라이딩된 메소드가 무조건 실행되도록 동적 바인딩 됨
(2) 규칙
- 부모 클래스의 메소드와 동일한 시그니처를 사용 → 부모 클래스의 메소드 이름, 메소드 인자 타입 및 개수, 리턴 타입 등 모든 것을 동일하게 정의해야함
- 부모 클래스의 메소드 보다 접근 범위를 더 좁게 수정할 수 없음
- 오버라이딩 불가한 것
- private 메소드: 부모 클래스 전용이므로 자식 클래스에 상속되지 않음
- 정적 메소드: 클래스 소속이므로 자식 클래스에 상속되지 않음
- final 메소드: final 메소드는 더 이상 수정할 수 없으므로 자식 클래스가 오버라이딩할 수 없음
(3) 오버라이딩 vs 오버로딩
비교 요소 |
메소드 오버로딩 |
메소드 오버라이딩 |
정의 |
같은 클래스나 상속 관계에서 동일한 이름의 메소드 중복 작성 |
자식 클래스에서 슈퍼 클래스에 있는 메소드와 동일한 이름의 메소드 재작성 |
관계 |
동일한 클래스 내 혹은 상속 관계 |
상속 관계 |
목적 |
이름이 같은 여러 개의 메소드를 중복 정의하여 사용의 편리성을 향상시킴 |
부모 클래스에 구현된 메소드를 무시하고 자식 클래스에서 새로운 기능의 메소드를 재정의 |
조건 |
메소드 이름은 반드시 동일함. 메소드의 인자의 개수나 인자의 타입이 달라야 성립 |
메소드의 이름, 인자의 타입, 인자의 개수, 인자의 리턴 타입 등이 모두 동일하여야 성립 |
바인딩 |
정적 바인딩. 컴파일 시에 중복된 메소드 중 호출되는 메소드 결정 |
동적 바인딩. 실행 시간에 오버라이딩된 메소드 찾아 호출 |
7.5 타입 변환과 다형성
(1) 객체의 타입 변환
- 참조 타입인 객체도 기초 타입 데이터처럼 타입 변환 가능. 단, 상속 관계일 경우만
- 자동 타입 변환(upcasting)과 강제 타입 변환(downcasting)이 있음
(2) 업캐스팅(upcasting)
- 프로그램에서 이루어지는 자동 타입 변환
- 자식 클래스의 레퍼런스 값을 부모 클래스 레퍼런스에 대입: 부모 클래스 레퍼런스가 자식 클래스 객체를 가리키게 되는 현상. 객체 내에 있는 모든 멤버에 접근할 수 없고 부모 클래스의 멤버에만 접근할 수 있음\
업캐스팅된 Person 객체가 접근할 수 있는 범위
(3) 강제 타입 변환(downcasting)
- 부모 클래스 레퍼런스를 자식 클래스 레퍼런스에 대입
- 자동 타입 변환(upcasting)된 것을 다시 원래대로 되돌리는 것. 명시적으로 타입을 지정해야함
- 타입 변환된 참조 변수로 객체의 타입을 구분하기 어렵기 때문에 instanceof 연산자를 사용함
- instanceof 연산자: 레퍼런스가 가리키는 객체의 진짜 타입을 식별할 수 있음
instanceof 연산자의 사용범