[JAVA]객체지향 핵심 - 상속
카테고리: JAVA
[17] 객체지향 핵심 - 상속
17.1. 클래스 상속
- 상속(Inheritance) : 클래스를 구현할 때, 다른 클래스의 속성이나 기능을 가져오는 것
- 구현해 둔 기존 클래스보다 더 구체적인 기능을 가진 클래스를 구현하고자 할 때 사용
17.2. 상속의 구조
- A클래스가 B클래스에게 상속한다.
- = B클래스가 A클래스를 상속받는다.
- 상속하는 클래스
- 상위 클래스, parent class, base class, super class
- 상속받는 클래스
- 하위 클래스, child class, derived class, sub class
17.3. 상속의 문법 형태
- extends 키워드
- 하나의 클래스만 올 수 있다
- 자바 단일 상속(Single inheritance)만 지원
class B extends A { }
17.4. 상속의 구현
- 상위 클래스는 하위 클래스보다 더 일반적인 개념과 기능을 가진다
- 하위 클래스는 상위 클래스보다 더 구체적인 개념과 기능을 가진다
- 상속에서의 확장(Extend) : 하위 클래스는 상위 클래스의 속성과 기능을 상속받는다
17.5. 상속에서의 클래스간 관계
- is a 관계 : ~ 은(는) ~ 이다(is a relationship : Inheritance)
- 서로 직접적인 관계에 있다
- 만들 클래스에 영향을 가장 많이 주는 클래스를 상속받는다
- 일반적인(general) 개념과 구체적인(specific) 개념과의 관계
- 상위 클래스 : 하위 클래스보다 일반적인 개념
- 하위 클래스 : 상위 클래스보다 구체적인 개념들이 더해짐
- 클래스간 결합도가 높은 설계(디자인)
- 상위 클래스의 수정이 하위 클래스에 영향을 미칠 수 있다
- AppCompatActivity / Activity
- 계층구조가 복잡하거나 Hierarchy가 높을 경우 부적합
17.5.2 상속에서의 클래스간 관계 2 - is a 관계와의 비교
- has a 관계 : ~은(는) ~을(를) 가지고 있다(Composition)
- 보조적일 경우 포함관계로 정의
- 다중 상속의 대안으로 사용가능
- 클래스의 멤버변수로 다른 클래스를 선언
- 작은 규모의 클래스들을 조합해 큰 규모의 클래스를 만들 수 있다
- 클래스가 다른 클래스를 포함하는 관계(변수로 선언)
- 코드 재사용의 가장 일반적인 방법
- 상속과 다르다
- 보조적일 경우 포함관계로 정의
17.6. Object 클래스
- 모든 클래스의 조상이 되는 클래스
- 일반적으로 사용자 정의 클래스는 자동으로 Object를 상속받는다
17.7. 접근 제한자 protected
- 외부클래스에 대해서는 private, 하위클래스에 대해서는 public으로 동작하도록 하는 기능을 가진 예약어
- 상위 클래스의 변수 및 메서드에 선언할 경우 외부클래스의 접근을 제한
- 상속을 받은 하위클래스에서 사용 가능
17.8. 접근 제한자(Access Modifier)의 제한 범위 정리
외부클래스 | 하위클래스 | 동일패키지 | 내부클래스 | |
---|---|---|---|---|
public | O | O | O | O |
protected | X | O | O | O |
default(선언X) | X | X | O | O |
private | X | X | X | O |
17.9. 상속에서의 클래스 생성 과정
- 하위 클래스 생성 시, 상위 클래스 먼저 생성
- ex)
new VIPCustomer()
클래스 생성 : 상위 클래스인Customer()
를 먼저 호출
- ex)
-
상위 클래스의 생성자 호출 이후, 하위 클래스의 생성자 호출
- 하위 클래스에 상위 클래스의 생성자를 호출하는 코드가 없는 경우
- 상위 클래스의 기본 생성자를 호출하기 위해 컴파일러가 자동으로 예약어
super()
를 추가한다- super() : 상위 클래스의 기본 생성자
- 상위 클래스에 기본 생성자가 없는 경우(매개변수가 있는 생성자만 있을 경우)
- 하위 클래스에서 상위 클래스의 생성자 명시 필요
- 상위 클래스의 기본 생성자를 호출하기 위해 컴파일러가 자동으로 예약어
- 상속에서의 인스턴스 메모리
- 상위 클래스의 인스턴스가 생성된 이후에 하위 클래스의 인스턴스 생성
17.10. 상위 클래스로의 묵시적 형 변환 (Upcasting)
-
하위 클래스의 인스턴스 생성 시, 상위 클래스의 클래스 형을 자료형으로 선언 가능
ex) - 인스턴스 VIPCustomer()의 자료형을 상위 클래스의 클래스 형인 Customer로 선언 상위 클래스의 클래스 형(Type) -------- Customer customer = new VIPCustomer(20220902, "이방원"); ------------------- 하위 클래스의 생성자 - VIPCustomer()의 생성자를 통해 인스턴스 생성 - 자료형에 따라 Customer의 변수와 메서드만 접근 가능
-
상위 클래스 → 하위 클래스 형 변환은 불가
17.11. 메서드 오버라이딩(Overriding)
- 조상 클래스에서 상속받은 메서드를 자손 클래스에 적합하도록 구현부를 수정하는 것
- 동일한 이름으로 재정의 가능
- 주로 상위 클래스에 정의된 메서드가 하위 클래스에서 구현할 내용과 맞지 않는 경우 사용
- 반드시 메서드의 선언부(리턴 타입, 메서드명, 매개변수)가 동일해야 한다
- 수정(Modify) 및 Change(변경)의 개념
17.12. 오버로딩(Overloading)
- 매개변수의 개수, 타입, 순서가 다른 경우 사용
- 서로의 매개변수 이름 및 리턴타입과는 무관
- 새로운 메서드를 만드는 것(New)
17.13. 애노테이션 (annotation)
- 원 의미 : 주석
- 컴파일러에게 특별한 정보를 제공하는 역할
@Override // 재정의된 메서드라는 정보 제공
17.14. [예제] 고객관리 프로그램 - 멤버쉽
- 고객 등급에 따라 차별화된 서비스 제공
- 할인율, 적립금 차등 적용
-
고객 등급별 클래스 정보
Customer
클래스(일반 고객)- 속성
- 고객 아이디
- 고객 이름
- 고객 등급
- 보너스 포인트
- 보너스 포인트 비율
- 물품 구매시 1%의 보너스 포인트 적립
- ex) 10,000원 상당의 상품 구매 시 100원 적립
- 기본 등급 : SILVER
- 속성
VIPCustomer
클래스(우수고객)Customer
클래스를 상속받아 기능을 확장하여 구현- 매출에 더 많은 기여를 하는 단골고객에게 혜택
- 제품 구매시 10% 할인
- 보너스 포인트 5% 적립
- 담당 상담원 배정
GoldCustomer
클래스(중간 등급 고객)- VIP 고객만큼 많이 구입하지는 않으나 이용 빈도가 높은 고객을 GOLD 등급으로 관리
- 혜택
- 제품 구매시 10% 할인
- 보너스 포인트 2% 적립
- 담당 상담원 미배정
댓글 남기기