개발/Java

Java] Do it 자바 프로그래밍 입문 요약 (둘째마당 - 08)

펭귀니 :) 2019. 6. 16. 21:55

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로 인스턴스형을 확인하지 않으면 오류가 발생할 수 있다.

상위 클래스로는 묵시적으로 형 반환이 되지만, 하위 클래스로 형 변환을 할 때는 명시적으로 해야 한다.