오늘은 어제에 이어서 상속을 공부한다.
어제는 상속의 개념과 실행에 대해 배웠으니
오늘은 오버라이딩 등 상속에 관련된 개념을 배우리라 생각한다.
상속의 특징
- 1) 모든 클래스는 Object 클래스의 후손:
Object는 단군 할아버지라고 비유
2) 부모 클래스의 생성자, 초기화 블록은 상속 안 됨:
자식 클래스가 스스로 부모를 생성하거나 부모의 값을 바꾸는 것은 안 됨
3) 부모의 private 멤버는 상속은 되지만 직접 접근 불가:
대신 getter/setter를 통해서 private 멤버를 사용할 수 있다.
오버라이딩
- 자식 클래스가 상속 받은 부모 메서드를 재정의 하는 것
부모가 제공하는 기능을 후손이 일부 고쳐 사용하겠다는 의미로
자식 객체를 통한 실행 시 후손 것이 우선권을 가짐- 특징:
메서드 헤드라인 위에 반드시 Annotation, @Override 표시(컴퓨터를 위한 주석)- 성립 조건:
(부모 클래스의 메서드와 자식 클래스 메서드의 비교)
1) 메서드 이름 동일
2) 매개변수의 개수, 타입, 순서 동일
3) return 타입 동일
4) private 메서드 오버라이딩 불가
5) 접근 제어자를 부모 것보다 같거나 넓은 범위로 변경 가능
6) 부모 메서드의 예외처리 클래스 처리 범위보다 좁은 범위로 예외처리 클래스 수정 가능
- 오버로딩과 비슷하지만 다른 개념임에 주의
final
- final 클래스:
상속이 불가능한 클래스public final class finalClass {}
- final 메서드:
상속 시 오버라이딩이 불가능한 메서드public final void method() {}
다형성
- 객체 지향의 언어 특징 중 하나로 하나의 행동으로 여러 일을 수행하는 개념
- 다양한 형태를 갖는다는 뜻
- 상속을 이용한 기술로 부모 클래스 참조변수 하나로
상속 관계에 잇는 여러 타입의 자식 객체를 참조할 수 있는 기술
클래스 형변환
- 1) 업 캐스팅(Up Casting)
- 2) 다운 캐스팅(Down Casting)
instanceof 연산자
- 현재 참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인 할 때 사용
- 클래스 타입이 맞으면 true, 맞지 않으면 false 반환
if(c instanceof Truck) { System.out.println("최대 적재 하중: " + ((Truck)c).getWeight()); }else if(c instanceof LightCar { System.out.println("할인율: " + ((LightCar)c).getDiscountOffer()); }else { Sysstem.out.println("차종이 등록되어있지 않습니다") }
바인딩
- 메서드 호출 구문과 실제로 수행될 메서드를 연결하는 것
- 1) 정적 바인딩:
프로그램 실행 전 컴파일 단계에서 메서드 호출부와 수행될 메서드를 묶는 것
(참조 변수의 자료형의 기준으로 연결)- 2) 동적 바인딩:
정적 바인딩된 메서드를 프로그램 실행 중 실행 단계에서 메서드와 수행될 메서드를 묶는 것
(참조하는 객체의 자료형을 기준으로 연결)
- 오버라이딩에서 자식 객체가 우선적으로 호출되는 구조적인 이유(동적 바인딩)
- 동적 바인딩은 실제 프로그램 실행되기 전까지는 컴퓨터가 알 수 없음