우아한테크코스 테코톡
클레이의 상속과 조합
카테고리 : 우아한테크코스 테코톡
클레이의 상속과 조합
상속
- 상속은 기존에 정의되어 있는 클래스에 필드와 메서드를 물려받아 새로운 클래스를 생성하는 기법
- 상속을 사용하면 쉽게 중복 코드를 줄이고, 또 코드를 재사용 하기도 쉽고 다형적인 클래스 들의 계층구조를 만들 수도 있다
- 상속의 대표적인 문제점
- 하위 클래스가 상위 클래스에 구현에 의존하기 때문에 상위 클래스의 변경이 모든 하위 클래스가 영향을 받을 수 있다
- 상위 클래스의 모든 public 메서드가 하위 클래스에도 반드시 노출되는 문제도 있다
- 상속은 부모 클래스와 강하게 의존하고 부모 클래스의 캡슐화를 해치고 결합도가 높아진다 그래서 부모 클래스의 구현을 변경하면 많은 자식 클래스를 모두 변경해 줘야 하는 상황이 발생할 수도 있다
- 상속은 자식클래스 입장에서 불필요한 부모 클래스의 public 메서드를 어쩔 수 없이 노출하게 된다
조합
- 전체를 표현하는 클래스가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 재사용하는 방법이다
- 조합은 상속의 문제점을 상당 부분 해결할 수 있다
- 먼저 상속과 달리 재사용되는 객체 내부 구현이 공개되지 않는다
- 메서드를 호출하는 방식으로 public 인터페이스에 의존하기 때문에 부분 객체의 내부 구현이 변경되어도 비교적 안전히디
- 조합은 조합된 객체의 모든 public 메서드들을 공개하지 않아도 된다
- 상속 대신 조합
- 조합하려는 부분 클래스의 인스턴스를 새로운 클래스의 private 필드로 참조하고 그 인스턴스의 메서드를 호출하는 방식으로 기능을 구현하면 된다
상속이냐 조합이냐
- 상속을 무조건 사용하지 말라는 건 아니다
- 다만 ‘상속을 사용하려고 할 때 내가 어떤 이유로 상속을 사용하는지 확실하게 알고 사용해야 한다’
- 상속에는 코드 재사용 말고도 다른 목적이 있다 바로 객체들의 계층구조를 구현하기 위해서도 상속을 사용한다
- 다형적인 계층구조를 위한 상속을 서브 타이핑이라고 하고 단순 코드 재사용을 위한 상속을 서브 클래싱 이라고도 한다
- 이 두 가지의 서로 다른 상속의 가장 큰 차이는 ‘부모 클래스의 행동과 자식 클래스의 행동이 서로 호환되는지’ 이다
- 일반적으로 상속의 문제는 코드를 단순 재사용 하려는 서브 클래싱을 했기 때문에 생겼다
- 단순 코드 재사용을 위해서 이렇게 상속을 하다 보면은 서로 다르게 행동하는 객체들이 서로 강하게 결합되고 불필요한 행동도 노출하게 된다
- 이런 잘못된 상속을 예방하기 위해서는 몇 가지 확인해야 될 점이 있다
- 두 객체가 서로 IS-A 관계인지 그리고 클라이언트 관점에서 두 객체가 동일한 행동을 할 것이라고 기대되는지 이 두 가지 질문에 모두 ‘예’ 라고 답할 수 있는 경우에만 상속을 고려해야 한다
- ‘단순히 코드를 재활용하고 싶고 중복코드를 없애고 싶다’ 하면 상속이 아닌 조합을 고려해야 한다
- 나는 클라이언트 입장에서 동일하게 행동하는 인스턴스를 그룹화 하고 싶다 즉, 다형성을 고려하고 싶다’ 라고 하면 상속을 사용하는 것을 고려할 수 있다