티스토리 뷰
# 목표
> 상속과 구현(인터페이스)의 차이점을 단순한 이론 정의에서 끝나는 것이아닌 사용용도 및 장,단점 측면에서 이해해 보자!
# 의문점?!
> 상속과 구현은 둘다 다형성을 구현하기 위해 사용이 되고 사용방법도 비슷하다.
> 상속과 구현의 차이점이 무엇일까?
# 관점1) 다중상속
상속은 다중상속을 지원하지 않고 인터페이스는 다중상속을 구현할 수 있다. 하지만 오늘 접근하고자 하는 목적은 다중상속과는 관련이 없다
# 관점2) 변화
상속과 조합(composition)의 차이점과 리스코프 치환 원칙(LSP)에 대해 공부를 하면 정답을 유추할수 있다고 생각한다. 나의 생각을 바로 이야기 한다면 상속은 코드를 하위 클래스에 공유하기 때문에 변화에 취약할수 밖에 없다. 반면 인터페이스는 코드를 하위 클래스와 공유하지 않기 때문에 변화에 닫혀 있다고 할수 있다.
상속을 사용해서 클래스를 정의한 경우, 부모 클래스와 자식 클래스 사이에는 강한 연관관계(Tightly-Coupled)가 생기게 된다. 이 경우 부모 클래스의 동작이 변경되면 자식 클래스들의 동작도 모두 영향을 받게 된다. 반면, 두 클래스의 관계가 'IS-A' 관계인 경우 이런 변경은 자연스럽다.
> (상속 vs 위임(delegation))의 차이를 나중에 업로드 예정! 함께 찾아보면 좋은 내용!
> 즉, 상속은 변화가 발생한다면 코드를 수정해야 한다는 문제가 발생한다. 하지만, 모든 코드를 인터페이스만으로 구성하는 것도 문제가 발생한다.
Why? 상속은 코드 중복을 없앤 확장과 재사용에 유리하기 때문이다!
Q. 그렇다면 언제 상속을 써야하고 언제 인터페이스를 사용해야 할까?
A. 상속
> 1. 확장을 고련한 설계를 할때
> 2. Is -A 관계가 확실할 때
> 3. 변화가 발생하지 않는 변수, 메소드, 클래스를 구성할때
A. 인터페이스
> 1. HAS -A 관계일 때
# 정리
상위 클래스는 물려줄 특성이 풍부할수록 좋다(LSP)
인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다(ISP)
상속은 Is -A를 만족하는 관계에서 재사용과 확장을 구현하였을때 변화가 적어야 하며
인터페이스는 추상적인 특성이 없는 즉, 추상과 달리 구체적인(개인적인?) 메소드를 구현할 때 사용해야 한다고 생각한다.
상속은 이미 구현 되어 있는 코드를 재사용하는 것이고
인터페이스는 구현되어 있지 않는 코드를 구현 단계에서 재정의 하기 때문에
상속은 어쩔수 없이 코드의 중복에 민감하고 재사용성이 뛰어나면
인터페이스는 추상적인 개념보다는 구체적인 개념에 더 가깝다고 생각한다.
# Is -A
Is -A 관계를 말로 정의 하기 어렵지만 상위 클래스(동물)는 하위 클래스(사자)의 특성에 위배되는 성질을 가지고 있으면 안되다고 생각한다.
'JAVA' 카테고리의 다른 글
TIL(12) 객체지향 설계 SOLID 5원칙 (0) | 2021.06.01 |
---|---|
TIL(11) 인터페이스 vs 추상 클래스 (0) | 2021.05.27 |
TIL(9) 다형성 - 코드적 접근 (0) | 2021.05.27 |
TIL(8) 객체 - 앨런케이의 정의(2) (0) | 2021.05.27 |
TIL(7) 객체 - 앨런케이의 정의(1) (0) | 2021.05.26 |