08) 상속과 다형성
상속이란?
B클래스가 A클래스를 상속받으면, B클래스는 A클래스의 멤버 변수와 메서드를 사용할 수 있음.
* B클래스 -> A클래스 (화살표 주의!)
=> A클래스가 B클래스에게 상속한다.
B클래스가 A클래스를 상속받는다.
= class B extends A { ...
* 예약어 private와 protected의 차이
둘 다 외부에서 사용할 순 없지만, protected는 하위 클래스에서는 public처럼 사용할 수 있음.
하위 클래스가 생성되는 과정
상위 클래스를 상속받은 하위 클래스가 생설 될 때는 반드시 상위 클래스의 생성자가 먼저 호출 된다.
하위 클래스에서 자동으로 super()을 호출
그래서 상위 클래스 생성자가 호출 될 때 상위 클래스의 멤버 변수가 메모리에 생성이 됨.
super 예약어
하위 클래스에서 상위 클래스 접근할 때 사용.
상위 클래스의 디폴트 생성자가 호출 됨.
매개변수 있는 생성자 호출하기
super(매개변수, 매개변수)로 직접 호출해줘야 한다.
상위 클래스로 묵시적 클래스 형 변환
가능한 경우 Ex) Customer vc = new VIPCustomer();
Customer -> 선언된 클래스형 (상위 클래스형)
VIPCustomer -> 생성된 인스턴스의 클래스형 (하위 클래스형)
이 때, 이 vc는 선언한 클래스형에 기반하여 멤버 변수와 메서드에 접근할 수 있다. (Customer 클래스의 멤버뿐이다.)
메서드 오버라이딩(method overriding)
상위 클래스에 정의한 메서드가 하위 클래스에서 재정의하는 것을 메서드 오버라이딩.
반환형, 메서드 이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야한다!
@Override => 애노테이션(주석)은 '이 메서드는 재정의된 메서드입니다.'라고 컴파일러에 명확히 알려 주는 역할을 한다.
묵시적 클래스형 + 메서드 오버라이딩
Customer vc = new VIPCustomer(10030, "나몰라", 2000); //VIPCustomer 인스턴스를 Customer형으로 변환
위 경우 원래 Customer형 메서드가 호출 되는 것이 맞지만, 호출 할 함수가 재정의 된 경우 가상 메서드 방식에 의해 VIPCustomer 인스턴스의 메서드가 호출됩니다.
다형성
다형성이란? 하나의 코드가 여러 자료형으로 구현되어 실행되는 것!
Customer customerLee = new Customer();
customerLee.setCustomerID(10010);
customerLee.setCustomerName("이순신");
customerLee.bonusPoint = 1000;
Customer customerKim = new VIPCustomer(10020, "김유신", 12345); //VIPCustomer를 Customer 형으로 선언
customerKim.bonusPoint = 1000;
위의 경우 자료형은 Customer 로 동일하지만 할인율과 보너스 포인트는 각 인스턴스의 메서드에 맞게 계산된다.
다형성 활용하기
배열 이용하여 고객의 지불 금액 확인하기!
ArrayList<Customer> customerList = new ArrayList<Customer>();
만약 재정의한 메서드가 가상 메서드 방식에 의해 자동으로 호출되지 않는다면 if-else if문을 사용하여 각 자료형에 적합한 코드를 따로 구현해야 할 것입니다.
상속과 다형성을 잘 활용하면 복잡한 코드를 간결하게 줄일 수 있고, 확장성 있는 프로그램을 구현할 수 있습니다.
* 상속 사용에 관련하여
IS-A 관계 (is a relationship; inheritance) 일반적인 개념- 구체적인(확장되는) 개념에서는 상속 적용
HAS-A 관계(has a relationship; association) 한 클래스가 다른 클래스를 소유한 관계에서는 상속 적용 X
다운 캐스팅
Animal ani = new Human();
생성된 인스턴스 Human은 Animal형입니다. 이렇게 Animal로 형 변환이 이루어진 경우 Animal 클래스에서 선언한 메서드와 멤버 변수만 사용할 수 있다. 따라서 다시 Human형으로 되돌아가야하는 경우에 하위 클래스로 다시 자료형을 변환하는 것을 다운 캐스팅이라고 합니다.
instanceof
Animal hAnimal = new Human();
if(hAnimal instanceof Human){ //hAnimal 인스턴스 자료형이 Human형이라면
Human h = (Human)hAnimal; //인스턴스 hAnimal을 Human형으로 다운 캐스팅해라
}
instanceof로 인스턴스형을 확인하지 않으면 오류가 발생할 수 있다.
상위 클래스로는 묵시적으로 형 반환이 되지만, 하위 클래스로 형 변환을 할 때는 명시적으로 해야 한다.
'개발 > Java' 카테고리의 다른 글
Java] Do it 자바 프로그래밍 입문 요약 (둘째마당 - 10) (0) | 2019.06.18 |
---|---|
Java] Do it 자바 프로그래밍 입문 요약 (둘째마당 - 09) (0) | 2019.06.16 |
Java] Do it 자바 프로그래밍 입문 요약 (둘째마당 - 07) (0) | 2019.06.14 |
Java] Do it 자바 프로그래밍 입문 요약 (둘째마당 - 06) (0) | 2019.06.14 |
Java] Do it 자바 프로그래밍 입문 요약 (둘째마당 - 05) (0) | 2019.06.11 |