GitHub

https://github.com/Choidongjun0830

공부

상속과 합성: 코드 재사용과 확장의 방법

gogi masidda 2025. 3. 9. 14:27

프로그래밍에서 코드의 재사용과 확장을 위한 방법으로 상속(Inheritance)합성(Composition) 이 있다. 두 개념 모두 기존 코드를 활용하여 새로운 기능을 추가하거나 확장하는 데 사용되지만, 그 방식과 특징은 상당히 다르다. 이 글에서는 상속과 합성의 차이점과 함께, 상속의 문제점을 합성을 통해 해결하는 방법을 살펴본다.

상속(Inheritance)

상속은 부모 클래스와 자식 클래스를 연결하여 부모 클래스의 코드를 재사용하는 방법이다. 상속 관계에서는 is-a 관계가 성립하며, 자식 클래스가 부모 클래스를 확장하여 새로운 기능을 추가하거나 재정의할 수 있다.

상속의 특징

  • 부모 클래스의 코드를 자식 클래스에서 직접 재사용할 수 있다.
  • 부모 클래스와 자식 클래스 사이의 의존성이 컴파일 타임에 해결되므로 정적인 관계를 갖는다.
  • 자식 클래스는 부모 클래스의 대부분의 기능을 물려받으며, 필요한 부분을 추가하거나 변경할 수 있다.
  • 부모 클래스의 구현을 자세히 알아야 하며, 내부 구현 변경이 자식 클래스에 영향을 미칠 수 있다.

상속의 문제점

  1. 불필요한 인터페이스 상속 문제
    • 자식 클래스는 필요하지 않은 부모 클래스의 메서드까지 상속받아야 할 수도 있다.
  2. 메서드 오버라이딩의 오작용 문제
    • 자식 클래스가 부모 클래스의 메서드를 오버라이딩할 때, 부모 클래스의 변경이 자식 클래스에 의도치 않은 영향을 미칠 수 있다.
  3. 부모 클래스와 자식 클래스의 동시 수정 문제
    • 부모 클래스의 변경이 모든 자식 클래스에 영향을 주어, 유지보수가 어려워질 수 있다.
    • 부모 클래스에 새로운 abstract 메서드가 추가되면, 이를 사용하지 않는 자식 클래스까지 해당 메서드를 구현해야 하는 문제가 발생할 수 있다.

합성(Composition)

합성은 하나의 객체가 다른 객체를 포함하여 필요한 기능을 제공하는 방식이다. 이는 has-a 관계를 가지며, 객체 간의 의존성이 런타임에 해결되므로 동적인 관계를 갖는다.

합성의 특징

  • 객체가 내부적으로 다른 객체를 포함하여 기능을 확장한다.
  • 퍼블릭 인터페이스를 통해 기능을 제공받기 때문에, 포함된 객체의 내부 구현에 의존하지 않는다.
  • 포함된 객체의 내부 구현이 변경되더라도 최소한의 영향만 받는다.
  • 실행 시점에서 객체 간의 관계를 유연하게 변경할 수 있다.

합성의 장점

  • 불필요한 메서드 상속 문제 해결: 필요하지 않은 메서드를 강제로 상속받지 않는다.
  • 내부 구현으로부터 독립적: 포함된 객체의 내부 구조를 몰라도 사용할 수 있다.
  • 유연성과 안정성 증가: 실행 시점에 다른 객체로 교체할 수 있어 확장성이 높다.

상속을 합성으로 변경하기

상속의 단점을 해결하기 위해 상속 관계를 제거하고 인스턴스 변수로 포함시키면 합성 관계로 변경할 수 있다. 이렇게 하면 다음과 같은 장점이 생긴다.

  • 불필요한 오퍼레이션이 클래스의 인터페이스를 오염시키지 않는다.
  • 필요한 기능만 사용할 수 있다.
  • 포함된 객체의 내부 구현을 알 필요가 없으므로, 유지보수가 용이하다.
  • 실행 시점에 객체를 조립할 수 있어 정책 변경이 가능하다.

합성을 사용할 때 적절한 경우

  • 런타임에 객체의 동작을 변경해야 할 때.
  • 코드의 유연성과 유지보수성을 높이고 싶을 때.
  • 부모 클래스의 불필요한 기능을 상속받고 싶지 않을 때.
  • 객체 간의 강한 결합을 피하고 싶을 때.

결론

상속은 조합의 결과를 개별 클래스 안으로 밀어 넣는 방법이며, 합성은 조합을 구성하는 요소들을 개별 클래스로 구현한 후 실행 시점에 인스턴스를 조립하는 방법이다. 상황에 따라 적절한 방법을 선택해야 하며, 유지보수성과 확장성이 중요한 경우 합성이 더 나은 선택이 될 수 있다.

728x90

'공부' 카테고리의 다른 글

SOLID 원칙  (3) 2025.03.26
템플릿 메서드 패턴 vs 전략 패턴  (2) 2025.03.16
equals()와 hashCode()의 개념과 관계  (0) 2025.03.01
단위 테스트  (0) 2025.03.01
객체와 자료 구조의 차이  (0) 2025.03.01