상속과 인터페이스는 객체 지향 프로그래밍에서 중요한 개념입니다. 둘 다 코드 재사용성과 다형성을 제공하지만, 그 구조와 목적은 서로 다릅니다.
상속(Inheritance)
개념
- 기존 클래스(부모 클래스 또는 슈퍼 클래스)의 속성과 메서드를 자식 클래스(서브 클래스 또는 파생 클래스)에게 물려주는 구조
- 자식 클래스는 부모 클래스의 모든 속성과 메서드를 상속받으며, 이를 기반으로 추가 기능을 구현하거나 부모의 기능을 재정의(오버라이딩) 할 수 있음
특징
- 단일 상속(Single Inheritance) : 대부분의 객체 지향 언어에서는 한 클래스가 오직 하나의 부모 클래스만 상속받을 수 있음
- 코드 재사용 : 부모 클래스의 코드를 자식 클래스에서 재사용할 수 있어 코드 중복을 줄임
- is-a 관계 : 상속은 is-a 관계로 설명됨. 즉, 자식 클래스는 부모 클래스의 일종
- 구현 상속 : 부모 클래스에서 구현된 메서드를 자식 클래스가 그대로 사용하거나 오버라이딩할 수 있음. 상속받은 메서드는 자식 클래스에서 다시 작성할 필요 없이 바로 사용할 수 있음
장점
- 재사용성 : 부모 클래스의 코드를 자식 클래스에서 재사용할 수 있어 코드의 중복을 줄이고 유지보수를 용이하게 만듬
- 확장성 : 기존 클래스의 기능을 확장하여 새로운 기능을 추가할 수 있음
단점
- 강한 결합 : 상속은 부모 클래스와 자식 클래스 간의 강한 결합을 초래할 수 있음. 부모 클래스가 변겨오디면 자식 클래스도 영향을 받음
- 단일 상속의 제한 : 자식 클래스는 하나의 부모 클래스만 상속받을 수 있으므로, 다른 클래스에서 상속받고 싶은 기능이 있을 때 이를 해결하기 어려움
인터페이스(Interface)
개념
- 클래스가 구현해야 할 메서드의 시그니처만을 정의한 일종의 계약
- 구체적인 구현을 제공하지 않으며, 이를 구현하는 클래스에서 인터페이스에 정의된 모든 메서드를 구현해야 함
특징
- 다중 구현(Multiple Implementation) : 자바와 같은 언어에서 한 클래스는 여러 인터페이스를 구현할 수 있음. 일르 통해 클래스는 다양한 행동을 할 수 있도록 설계됨
- 구현 강제 : 인터페이스를 구현하는 클래스는 반드시 인터페이스에 정의된 모든 메서드를 구현해야 함
- is-a 관계와 can-do 관계 : 인터페이스는 주로 can-do 관계로 설명됨.
- 구현 제공 없음 : 메서드의 선언만 포함하며, 실제 메서드의 동작은 인터페이스를 구현하는 클래스가 정의함. 자바 8 이후에는 default 메서더를 사용하여 인터페이스 내에 구현도 포함할 수 있게 되었지만, 여전히 주된 목적은 구현을 강제하는 것
장점
- 다중 구현 가능 : 자바와 같은 언어에서는 한 클래스가 여러 인터페이스를 구현할 수 있으므로, 여러 행동을 동시에 구현할 수 있음
- 유연성 : 클래스 간의 결합을 느슨하게 만들어, 유지보수와 확장이 더 용이해짐. 인터페이스는 어떤 클래스가 다른 클래스와 어떻게 상호작용할지를 정의할 뿐, 그 구현을 강제하지 않기 때문에 유연
- 표준화된 구조 : 인터페이스는 여러 클래스가 동일한 메서드를 제공하도록 강제하여 일관성을 유지
단점
- 코드 중복 : 실제 구현을 제공하지 않기 때문에, 인터페이스를 구현하는 클래스에서 동일한 메서드 구현이 중복될 수 있음
- 복잡성 증가 : 다중 인터페이스 구현은 클래스가 다양한 동작을 할 수 있게 하지만, 그만큼 클래스 구조가 복잡해질 수 있음
상속과 인터페이스의 주요 차이점

언제 사용할까?
상속
- 두 클래스 간의 is-a 관계가 명확할 때
- 부모 클래스의 대부분의 기능을 자식 클래스에서도 사용할 수 있을 때
- 코드 재사용성이 주목적일 때
- 부모 클래스에서 제공하는 기본 기능을 자식 클래스에서 수정하거나 확장하려는 경우
인터페이스
- can-do 관계가 필요할때. 즉, 클래스가 특정 행동(메서드)를 할 수 있도록 설계할 때
- 여러 클래스를 다양한 방식으로 확장하려는 경우(다중 구현이 필요한 경우)
- 서로 다른 클래스가 동일한 동작을 해야 할 때
- 클래스 간 결합도를 낮추어 유연한 설계를 하고 싶을 때
상속은 클래스 간의 상속 구조를 통해 코드를 재사용하거나 확장할 때 사용하고, 인터페이스는 행동 계약을 강제하여 여러 클래스가 동일한 행동을 할 수 있도록 유도하는 데 사용