08-01 상속이란?
B클래스가 A클래스를 상속받으면 B 클래스는 A 클래스의 멤버 변수와 메서드 사용 가능
-> 그 기반이 되는 기술이 '상속'
A 클래스: 부모, 상위 클래스
B클래스 : 자식, 하위 클래스
class B extends A { }
Customer 클래스와 VIPCustomer 클래스를 구현해본다고 하자.
VIPCustomer에게는 일반 고객에게 제공하는 혜택을 기본으로 하고 추가 속성과 메서드를 추가하면 됨.
public class VIPCustomer extends Customer { }
Customer 클래스에서 사용한 변수인 customerGrade가 private으로 선언되어 있다면 protected로 바꾸자.
상위클래스에서 작성한 변수나 메서드 중 외부 클래스에서 사용할 순 없지만 항위 클래스에선 사용할 수 있도록 지정하는 예약어가 바로 protected ~!
그리고 get(), set() 메서드를 추가하자.
-> private 변수처럼 protected 변수도 외부 클래스에서 값을 가져올 수도, 지정할 수도 있게 된다.
08-02. 상속에서 클래스 생성과 형 변환
하위 클래스가 생성될 땐 상위 클래스의 생성자가 !반드시! 먼저 호출됨.
그리고 상위 클래스 생성자가 호출될 때 상위 클래스의 멤버변수가 힙 메모리에 생성되는 것임.
알고 가자!) 상위 클래스의 private 변수도 생성은 되지만 단지 하위 클래스에서 접근을 못하는 것일 뿐이다!
하위 클래스의 생성자에서 super()를 자동으로 호출하기 때문에 상위 클래스의 디폴트 생성자가 호출되는 것이다.
알고 가자!) super()는 컴파일러가 자동으로 추가하는 코드.
super로 상위클래스의 멤버변수나 메서드를 참조할 수도 있다.
super.showCustomerInfo()
상위클래스로 묵시적 형변환
Customer vc = new VIPCustomer()
VIPCustomer 클래스로 인스턴스를 생성할 때 이 인스턴스의 자료형을 Customer형으로 클래스형 변환하여 선언할 수 있음 = 업캐스팅(upcasting)
하지만, 클래스의 자료형이 Customer로 한정되어졌기 때문에 VIPCusotmer 클래스의 멤버변수와 메서드는 사용 불가능해짐.
만약 다시 사용하고 싶다면 VIPCustomer로 다운캐스팅(downcasting)하면 됨
알고가자!) 모든 하위 클래스는 상위 클래스 자료형으로 형 변환할 수 있지만, 그 역은 성립 불가
08-03. 메서드 오버라이딩
만약 '일반 고객은 정가를 그대로 지불하지만 VIP 고객은 10%할인은 받을 수 있다.' 는 가정이 생긴다면,
VIPCustomer에서 Customer 클래스의 calcPrice() 메서드를 그대로 사용할 수 없게 된다.
메서드 오버라이딩 : 상위 클래스에서 정의한 메서드가 하위 클래스에서 구현할 내용과 맞지 않을 경우 메서드를 재정의하는 것
알고가자!) 오버라이딩하려면 반환형, 메서드 이름, 매개변수 개수, 매개변수 자료형이 같아야 함
@Override
public int calcPrice(int price) { ... return price - (int)(price * 0.1) }
애노테이션 ? 컴파일러에게 특정한 정보를 제공해 주는 역할을 함, 만약 메서드의 선언부가 다르다면 컴파일 오류가 발생하여 개발자의 실수를 막아줌
예) @Override @FuntionalInterface @Deprecated @SuppressWarnings
가상 메서드 : 상속에서 상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정됨.
선언한 클래스형 (x) 생성된 인스턴스 (o) 메서드를 호출
알고가자!) 인스턴스가 생성될 때마다 변수는 생성되지만, 메서드는 실행해야 할 명령 집합이므로 여러개 생성되지 않는다.
일반적으로 메서드를 호출하면 '메서드 영역의 주소를 참조'하여 명령이 실행되는 것이다. 즉, 인스턴스가 달라도 동일한 메서드가 호출된다.
하지만 가상 메서드는 '가상 메서드 테이블'을 만든 후, 각 메서드 이름과 실제 메모리 주소가 짝을 이루고 있다가 테이블의 주소 값을 찾아서 해당 메서드의 명령을 호출하는 원리이다.
재정의된 메서드는 실제 인스턴스에 해당하는 메서드가 호출되고,
재정의되지 않은 메서드는 메서드 주소가 같으며 상위 클래스의 메서드가 호출된다.
// VIPCustomer 인스턴스를 Customer 형으로 변환
Customer vc = new VIPCustomer(10030, "나몰라", 2000)
=> 원래 Customer 형 메서드가 호출되는 것이 맞지만, 가상 메서드 방식에 의해 VIPCustomer 메서드가 호출된다!!
"Do IT! 자바 프로그래밍 입문" 책을 읽고 요약하는 글입니다.
p.232~258
'CS 공부 > JAVA' 카테고리의 다른 글
[JAVA] 상속과 다형성 (3) (0) | 2023.07.16 |
---|---|
[JAVA] 상속과 다형성 (2) (0) | 2023.07.14 |
이클립스 실행 오류... (0) | 2022.01.13 |
객체지향..ER다이어그램... (0) | 2021.02.21 |
5장 클래스 분리 (0) | 2021.02.19 |