Spring/스프링입문을 위한 자바객체지향의 원리와 이해

is-a 관계, 진짜 맞는 말일까? 상속과 인터페이스의 차이

1space 2025. 6. 30. 15:10

스프링입문을 위한 자바 객체지향의 원리와 이해』로 공부한 내용을 정리한 글입니다

 

상속은 단순한 ‘계보도’가 아니다 – 재사용과 확장의 개념

프로그래밍에서 “상속”이라고 하면 종종 사람들은 사람 간의 혈연 관계를 떠올립니다. 할아버지 → 아버지 → 자식 이런 식의 계보도를 생각하기 쉽죠. 그러나 객체지향 프로그래밍에서 말하는 상속은 그렇게 ‘혈연적 연결’이 아닌, 재사용과 확장의 개념입니다.

예를 들어, "포유류"라는 상위 개념 아래 "고래", "박쥐"와 같은 하위 개념들이 나옵니다. 이건 상속이 아닙니다. 포유류는 고래의 부모가 아니니까요. 실제로는 동물이라는 개념을 ‘분류’한 결과일 뿐입니다.

객체지향에서의 상속은 다음과 같이 이해하는 것이 더 정확합니다:

"상위 클래스의 속성과 기능을 물려받아 하위 클래스가 그대로 사용하거나, 필요에 따라 확장해 사용하는 것"

예를 들어, 동물 클래스가 있고 이 동물 클래스를 상속받은 고래, 박쥐 클래스가 있다고 해보죠. 고래 클래스는 동물의 기본 특성(먹기, 자다 등)을 그대로 사용하면서, 고유의 기능(수영하기)을 추가할 수 있습니다. 이것이 바로 상속입니다.

 

상속은 is-a 관계를 만족해야 한다

상속이 가능한 경우는 단 하나입니다. 하위 클래스 is-a 상위 클래스일 때입니다.

예:

  • "펭귄 is a 동물" → ✅
  • "사람 is a 동물" → ✅
  • "사람 is a 물고기" → ❌

이때 펭귄은 클래스가 아니라 객체입니다. 동물은 클래스고요.
따라서 상속에서 말하는 is-a는 클래스 간 관계를 의미합니다.

즉, 클래스 간에 "하위 클래스 is-a 상위 클래스"가 성립해야 상속이 가능합니다.

 

is-a 관계보다 정확한 표현: is-a-kind-of

실제로 더 정확한 표현은 아래와 같습니다.

  • 고래 is a kind of 포유류
  • 펭귄 is a kind of 조류

즉, 종류(kind) 관계로 이해하는 것이 맞습니다. UML에서도 이 관계를 inheritance로 표현하며, 자바에서도 extends 키워드를 통해 나타냅니다.

 

다중 상속의 모호함과 자바의 선택

C++은 다중 상속을 지원합니다. 하지만 이는 서로 다른 부모 클래스에서 동일한 이름의 메서드나 속성을 상속받았을 때 충돌이 발생할 수 있는 문제가 있습니다.
예: 사람 extends 교수, 사람 extends 운동선수 이런 식으로 두 부모에게 동시에 상속받으면, 이름, 주소, 자기소개() 같은 메서드가 충돌할 수 있겠죠?

자바는 이러한 문제를 피하기 위해 다중 상속을 지원하지 않습니다. 대신, 인터페이스를 통한 다중 구현을 제공합니다.

 

인터페이스는 "할 수 있는 능력"을 의미한다

인터페이스는 어떤 클래스가 무엇을 할 수 있는지를 명시하는 일종의 능력 계약서입니다.

  • Flyable: 날 수 있는
  • Runnable: 달릴 수 있는
  • Serializable: 직렬화할 수 있는
  • Cloneable: 복제할 수 있는

예:

public interface 날수있는 {
    void fly();
}

public class 펭귄 implements 동물, 날수있는 {
    public void fly() {
        // 펭귄은 사실 못 날지만 예시입니다
    }
}

이런 식으로 인터페이스는 동작 중심(능력 중심) 이고, 상속은 속성과 구현 중심(구조 중심) 이라고 보면 됩니다.

 

요약

개념 의미 관계 표현
상속 (extends) 속성과 기능을 물려받아 사용하거나 확장 is-a 또는 is-a-kind-of
인터페이스 (implements) 어떤 기능을 할 수 있다는 선언 can-do, be-able-to

자바에서는 "상속은 단일 상속만 허용하고", "인터페이스는 다중 구현이 가능"합니다. 객체지향 설계에서 클래스 간 상속은 신중해야 하며, 코드 재사용보다 의미 있는 분류 체계와 관계 정의가 핵심입니다.

 

'Spring > 스프링입문을 위한 자바객체지향의 원리와 이해' 카테고리의 다른 글

캡슐화  (0) 2025.06.30
다형성  (0) 2025.06.30
객체지향에서의 상속  (0) 2025.06.30
static 멤버 vs 인스턴스 멤버  (0) 2025.06.30
추상화와 메모리  (0) 2025.06.30