Inheritance and Polymorphism with Java

민준·2023년 2월 20일
0
post-thumbnail

1. Inheritance

상속 이란, 이미 구현된 클래스를 상속 받아서 속성이나 기능이 확장되는 클래스를 구현하는 것입니다.
상속 하는 클래스를 '상위 클래스', '부모 클래스' 등으로 말하며 비교적 일반적인 의미를 가집니다.
상속 받는 클래스를 '하위 클래스', '자식 클래스' 등으로 말하며 상위 클래스보다 구체적인 의미를 가집니다.
예를 들면, '생물 > 동물 > 포유류 > 사람' 과 같이 생물보다 사람이 비교적 구체적인 의미가 되는 것과 같습니다.
'상속'을 사용하면 객체 지향 프로그래밍에서 다형성을 구현할 수 있습니다.

ㄱ) 클래스 상속 문법

class 하위클래스명 extends 상위클래스명 {

}

자바는 'Single Inheritance'만을 지원하므로 'extends' 뒤에는 단 하나의 클래스만 사용할 수 있습니다.

강의에서는 '상속' 이전에 '합성' 이라는 개념에 대해 이야기합니다.

위의 두 코드에서 x, y라는 변수가 중복되지만 상하 관계가 아니므로
'Circle' 클래스에서 'Point' 클래스의 속성이나 기능을 상속받지 않습니다.
그런데- 지금 이렇게 글을 쓰다보니 문득, 그럼 이것과 상속의 차이가 대체 무엇인지 궁금해집니다.
이에 대해서는 강의를 더 듣다보면 해답을 얻을 수 있겠죠?

고객 관리 프로그램

이 강의에서는 '상속'을 설명하기 위해 이를 활용한 고객 관리 프로그램을 작성합니다.

  • 고객의 정보를 활용해 고객 맞춤 서비스 구현
  • 고객의 등급에 따라 차별화된 할인율과 포인트 지급
  • 등급에 따른 클래스를 따로 구현하는 것이 아닌, 일반적인 클래스를 먼저 구현하고 보다 많은 기능의 클래스는
    상속을 활용하여 구현

Customer 클래스 속성

멤버 변수설명
customerID고객 아이디
customerName고객 이름
customerGrade고객 등급 :
- 기본 생성자에서 지정되는 기본 등급은 'SILVER'입니다.
bonusPoint보너스 포인트 :
- 고객이 제품을 구매할 경우 누적되는 보너스 포인트입니다.
bonusRatio보너스 포인트 적립율 :
- 고객이 제품을 구매할 때 구매 금액의 일정 비율이 보너스 포인트로 적립됩니다.
- 기본 생성자에서 지정되는 적립 비율은 1%입니다.

고객 등급

단골고객에 대한 혜택입니다. 여기에서는 코드의 등급을 모두 적었지만
새로운 등급이 생기더라도 기존 클래스의 속성에 추가하는 것이 아니라 상속을 활용하는 방식을 사용합니다.

고객 등급할인율적립율추가 혜택
SILVER-1%-
GOLD
VIP10%5%담당 전문 상담원 배정

이 코드에 'GOLD' 등급을 추가한다면 'VIPCustomer' 클래스처럼 'Customer' 클래스를 상속받아
멤버변수만 수정하면 되겠습니다.

어떤 기준에 따라 멤버변수나 메서드의 추가가 필요하다면 위와 같이 클래스 상속을 통해
클래스들을 깔끔하게 정리하고 유지보수가 비교적 쉬워질 수 있겠습니다.

ㄴ) 접근 제한자 가시성

외부 클래스하위 클래스동일 패키지내부 클래스
publicOOOO
protectedXOOO
(default)XXOO
privateXXXO

위 코드에서 하위 클래스 'VIPCustomer'의 생성자에 상위 클래스 'Customer'의 속성이 있어
그 값을 넣어주려는데 해당 변수가 'private' 이라면 접근이 안됩니다.
이때 상속 관계에서만 'public'과 같이 활용할 수 있는 'protected'를 사용할 수 있습니다.
이는 심지어 패키지가 다르더라도 상속 관계 안에서는 사용이 가능합니다.

반면 'default'의 경우 같은 패키지 내에서만 접근이 가능합니다.

ㄷ) super 예약어

'this'가 자기 자신의 인스턴스 주소를 가지는 것처럼 super 는 하위 클래스가 상위 클래스에 대한 주소를 가지게 됩니다.
매개변수가 없는 경우 디폴트 생성자를 호출하는데 프리컴파일 단계에 자동으로 추가됩니다.
이는 하위 클래스가 상위 클래스에 접근해 속성값 등을 가져올 때 사용할 수 있습니다.

만약 상위 클래스에 디폴트 생성자가 따로 없이 매개변수를 받는 생성자만 있다면
컴파일러가 'super()'를 기본적으로 제공하더라도 에러가 나므로 매개변수를 함께 넣어 정의해야 합니다.
위 코드에서는 하위 클래스 인스턴스를 생성할 때 받는 매개변수가 'super'를 통해 상위 클래스의 멤버변수로 들어갑니다.

ㄹ) 형 변환

a) Up Casting

상위 클래스 형으로 변수를 선언하고 하위 클래스 인스턴스를 생성할 수 있는데, 이를 업캐스팅 이라고 합니다.
하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형변환이 가능합니다.

Customer vc = new VIPCustomer();

b) 형 변환에서의 메모리

위 코드에서 참조변수 'vc'는 상위 클래스(Customer)의 멤버 변수와 메서드만 사용할 수 있습니다.
'VIPCustomer()' 생성자의 호출로 인스턴스는 모두 생성되었지만
타입이 'Customer'이므로 'Customer'의 변수와 메서드만 접근할 수 있습니다.


정리하며-
위에서 '합성'과 '상속'에 어떤 차이가 있는지 궁금했고 코드나 글을 여러번 반복해 보았지만
당장 굳이 이 둘을 나눠 사용하는 이유를 저는 당장 알 수 없었습니다.
이에 대해 검색해 본 결과 이 블로그를 찾았습니다. 👉 '합성' vs '상속'

profile
백엔드 포지션 공부 중입니다.

0개의 댓글