목차
1. 상속 개념
2. 상속 문법과 다형성
3. 오버라이딩(Overriding)
4. 위임 (= 연관)
공통 코드를 공유
하는 방법 = 상속의 목적 그 자체
- 클래스들의 공통 코드(필드, 메서드)를 추출하여 별도의 클래스로 정의하는 것.
- 이렇게 정의한 클래스를 공유하는 것.
- 기존 클래스를 연결하고 필드나 변수를 추가하여 역할을 특화시키는 것.
- 상황에 맞춰 여러 용도로 사용되는 것.
- 다형적 변수(polymorphic variables) : 상위 타입의 변수는 하위 타입의 객체를 가리킬 수 있다.
명명
상위클래스(super class = parent class)
^
| : 기능을 상속한다. (inheritance) ------------ 속이 빈 화살표를 사용한다.
|
하위클래스(sub class = child class)
주의! - 상위클래스의 필드와 메서드를 '가져오는 것이 아니다.'
= 코드 공유 방법
class Board extends Object {}
// extends Object
// 의 경우에는 생략가능하다.
상위 클래스 레퍼런스는 하위 클래스의 인스턴스주소를 저장할 수 있다.
= 하위 클래스의 인스턴스를 가리킬 수 있다.
ex) Sedan s = new Car();
를 할 수 없다.
모든 차들은 세단이 아니기 때문이다.
s
가sedan
타입이라서sedan
의 기능을 사용하려 하겠지만s
가car
를 가리키고 있어서 실행오류가 발생할 것이다.
= 유지보수가 힘들다
= 이전 프로젝트에 영향을 끼치지 않는다.
= 개발비용 절감, 버그 추가 가능성 낮춘다
, 코드 중복을 없앤다.
상속과 인스턴스 필드
생성자 호출
super()
this()
오버라이딩(Overriding) : 수퍼클래스의 메서드를 현재클래스의 역할에 맞춰 재정의
generalizatoin : 기본 기능을 추출해서 부모 클래스로 재정의.
추상메서드 : sub클래스에서 재정의 해야할 메서드라면 수퍼클래스에서 정의하지 않는다.
메서드 형식만 정의하자!
= 메서드 바디를 만들지 않는다.
public abstract void run();
까지만하고 메서드 바디{}
가 없다.- 부모 클래스에도
public abstract class Parent {...
라고 써줘야한다
추상메서드에서 말하는 '메서드 형식' : Method Signature
Concrete Class : 구체 클래스 : 추상클래스를 상속받아서 제대로 (콘크리트처럼 딱딱하게) 구현된 클래스
상속의 한계 : 쓰기 싫은 기능이 있어도 부모의 기능이라면 상속받아서 사용하게 된다.
해결법 :: '위임' 기능 사용!
Calculator c = new Calculator();
라고 한 후
c.plus(), c.minus(), ...
등으로 사용하고
기능을 추가하고 싶을 땐 직접 처리한다.
수퍼클래스와 서브클래스는 강하게 결합되어 있기 때문에 수퍼 클래스 교체가 매우 어렵고, 교체한다 하더라도 기존 코드에 너무 많은 영향을 끼친다
= 유지 보수가 어렵다.
= 연관(association)을 통해서 해결하고자 함.
클래스 관계
1) 상속(inheritance) 속빈화살표
class B extends A
2) 연관(associatoin) 일반화살표
class B { A obj = ....}
3) 집합(aggregation) 속빈다이아몬드꼬리
class B { A obj; }
4) 합성(composition) 까만다이아몬드꼬리
class B { A obj; }
< 집합과 합성 >
집합 : B가 사라져도 A가 사라지지 않는다.
합성 : 위와 반대로 B가 사라지면 A도 사라진다.= lifecycle이 같다.
5) 의존(dependency)(B가 A를 의존한다.)점선화살표
class B {void m(A obj) }