스터디에서 아래와 같은 코드가 있었는데
Player.LEFT_PAGE_INDEX
이 경우합성
을 이용하는 것이 낫다는 피드백을 받았다. new 생성자를 받아 써야한다는 말 같긴 했는데 합성이라는 용어가 낯설었다. 좀 알아보고 싶다!
public static void validate(List<Integer> player) {
int leftPageNumber = player.get(Player.LEFT_PAGE_INDEX);
int rightPageNumber = player.get(Player.RIGHT_PAGE_INDEX);
}
상속을 자제하고 합성(Composition)을 이용하자
위의 초기화 코드에서 볼수 있듯이, 마치 new 생성자에 new 생성자를 받는 형식 new Car(new Engine("디젤")) 으로 쓰여진다.
즉, Car 클래스가 Engine 클래스의 기능이 필요하다고 해서 무조건 상속하지말고, 따로 클래스 인스턴스 변수에 저장하여 가져다 쓴다는 원리이다.
이 방식을 포워딩(forwarding)이라고 하며 필드의 인스턴스를 참조해 사용하는 메소드를 포워딩 메소드(forwarding method) 라고 부른다.
그래서 클래스간의 합성 관계를 사용하는데 다른 말로 Has-A 관계라고도 한다.
객체 지향에서 다른 클래스를 활용하는 기본적인 방법이 바로 합성을 활용하는 것이다.