포스트

상속과 다형성은 어떻게 연결되는가

객체지향을 설명할 때 상속과 다형성은 거의 항상 함께 등장한다. 하지만 둘은 같은 개념이 아니다. 상속은 구조를 재사용하는 방법이고, 다형성은 같은 메시지를 서로 다른 방식으로 처리하게 만드는 성질이다.

상속이란 무엇인가

상속은 기존 클래스의 속성과 동작을 기반으로 새로운 클래스를 정의하는 방식이다.

1
2
3
4
5
6
7
8
public class Animal {
    public void sound() {
        System.out.println("some sound");
    }
}

public class Dog extends Animal {
}

DogAnimal을 상속받아 부모가 가진 메서드를 사용할 수 있다.

상속의 장점

상속의 가장 큰 장점은 중복을 줄이고 공통 규약을 묶는 데 있다.

  • 공통 필드와 메서드를 부모에 모을 수 있다
  • 여러 자식 클래스가 같은 계약을 공유할 수 있다
  • 자식 클래스는 공통 동작을 재사용하면서 필요한 부분만 확장할 수 있다

다만 “코드 재사용”만을 이유로 상속을 남발하면 결합도가 높아지고 구조가 경직되기 쉽다.

상속의 대상이 되는 것

자식 클래스가 부모의 모든 것을 그대로 물려받는 것은 아니다.

  • private 멤버는 직접 접근할 수 없다
  • 생성자는 상속되지 않는다
  • 접근 제한자에 따라 사용 가능 범위가 달라진다

즉, 상속은 부모의 구현 전체를 무조건 복사하는 것이 아니라, 언어가 허용한 범위 안에서 구조와 동작을 계승하는 방식이다.

다형성이란 무엇인가

다형성은 같은 타입으로 다루더라도 실제 객체에 따라 다른 동작이 실행되는 성질이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Animal {
    public void sound() {
        System.out.println("some sound");
    }
}

public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("bark");
    }
}

public class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("meow");
    }
}
1
2
3
4
5
Animal a1 = new Dog();
Animal a2 = new Cat();

a1.sound(); // bark
a2.sound(); // meow

변수 타입은 둘 다 Animal이지만, 실제 실행되는 메서드는 각 인스턴스의 구현이다. 이것이 다형성이다.

상속과 다형성은 왜 함께 언급되는가

상속은 다형성을 가능하게 만드는 대표적인 기반이다.

부모 타입으로 자식 객체를 참조할 수 있어야, 동일한 인터페이스나 동일한 상위 타입 아래에서 여러 구현을 교체할 수 있기 때문이다.

즉:

  • 상속은 타입 관계를 만든다
  • 다형성은 그 타입 관계 위에서 동작을 교체 가능하게 만든다

실무에서 더 중요한 관점

초기 학습에서는 “상속을 하면 다형성이 된다” 정도로 배우지만, 실무에서는 다음 질문이 더 중요하다.

  • 정말 상속이 필요한 관계인가
  • 단순 재사용 때문에 상속을 선택한 것은 아닌가
  • 공통 부모보다 인터페이스나 조합이 더 나은가

예를 들어 자식 클래스가 부모 구현 세부에 강하게 묶이기 시작하면, 작은 변경도 전체 계층에 영향을 줄 수 있다. 이런 경우에는 조합이 더 안전하다.

상속보다 조합이 나은 경우

다음과 같은 경우에는 상속보다 조합이 더 적합한 경우가 많다.

  • 공통 동작보다 역할 조합이 더 중요할 때
  • 런타임에 구현 교체가 필요할 때
  • 부모와 자식이 진짜 is-a 관계가 아닐 때
  • 재사용보다 유연성이 더 중요할 때

객체지향 설계에서 상속은 강한 관계고, 조합은 더 느슨한 관계다. 그래서 실무에서는 상속을 기본값처럼 쓰기보다 신중하게 선택하는 편이 좋다.

정리

  • 상속은 공통 구조와 동작을 계승하는 방법이다
  • 다형성은 같은 타입 아래에서 다른 구현이 동작하게 하는 성질이다
  • 상속은 다형성을 가능하게 하는 대표적인 수단이지만 유일한 수단은 아니다
  • 실무에서는 상속의 편의보다 결합도와 변경 비용을 함께 봐야 한다

상속과 다형성을 이해하는 핵심은 문법이 아니라, 어떤 변경을 쉽게 만들고 어떤 결합을 강하게 만드는가를 보는 데 있다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

댓글

아직 댓글이 없습니다