객체지향 공부하다 보면 "상속보다 컴포지션을 선호하라(Favor composition over inheritance)"는 말이 계속 나오잖아요. 근데 저는 상속이 코드 재사용도 잘 되고 편해서 왜 굳이 피하라는 건지 잘 와닿지가 않았어요.


그러다 다이아몬드 문제라는 걸 봤는데 이게 관련이 있는 건가 해서요. 예를 들어 A라는 클래스가 있고 B랑 C가 각각 A를 상속하고, 다시 D가 B랑 C를 둘 다 상속하면, A에 있던 메서드를 D가 B쪽 걸로 물려받는지 C쪽 걸로 물려받는지 애매해진다는 거죠. 다이아몬드 모양이라서 그렇게 부른다더라고요.


찾아보니까 C++은 virtual 상속으로 어떻게든 해결하고, 자바는 아예 클래스 다중상속을 막아버렸다는데, 그럼 자바 쓰는 사람은 이 문제 신경 안 써도 되는 거 아닌가요? 근데도 컴포지션 얘기를 계속 하니까 뭔가 더 근본적인 이유가 있는 것 같은데요.


제가 이해한 컴포지션은 "D가 B다(is-a)" 대신 "D가 B를 가진다(has-a)"로 바꿔서, 필요한 기능만 필드로 들고 있는 거잖아요. 이렇게 하면 다이아몬드 같은 모호함이나 강한 결합을 피할 수 있다는 게 핵심인가요? 제가 방향을 제대로 잡은 건지 확인받고 싶어요.