상속성

2022. 11. 14. 15:58책 공부/스프링 입문을 위한 자바 객체 지향의 원리와 이해

반응형

객체 지향 상속에 대한 예시

위의 예시를 보면 알 수 있듯이 객체 지향에서의 상속은 우리가 일반적으로 알고 있는 상속의 개념이 아니라 

상위 클래스의 특성을 하위 클래스에서 상속하고 거기에 더해 필요한 특성을 추가하는 것이다.

즉 확장과 세분화의 개념이다.

 

따라서 부모 클래스 - 자식 클래스라는 표현보다는 상위 클래스 - 하위 클래스 또는 슈퍼 클래스 - 서브 클래스라는 표현이 맞고 상위 클래스 쪽으로 갈수록 추상화, 일반화 됐다고 말하며, 하위 클래스 쪽으로 갈수록 구체화, 특수화 됐다고 말한다.

추상화와 구체화

 

상속 관계에서 반드시 만족해야 할 문장이 있다.

 

      " 하위 클래스는 상위 클래스이다. "

        - 로버트 C.마틴의 객체 지향 설계 5원칙 中 LSP( 리스코프 치환 원칙 ) -

 

예를 들어보자
상속의 잘못된 예인 조직도의 경우 

- 아버지는 할아버지다

- 아들은 어머니다.

- 사촌형(오빠)은 삼촌이다. 


전혀 말이 되지 않는다.

하지만 상속의 올바른 예인 분류도의 경우

- 포유류는 동물이다.

- 고래는 포유류이다.

- 고래는 동물이다.

너무나 자연스럽다.

 

 

"하위 클래스는 상위 클래스다." 라는 문장은 로버트 C.마틴이 주장한 객체 지향 설계 5원칙 가운데 LSP( 리스코프 치환 원칙 )를 나타내는 말이다. 

 

 

즉 자바에서 상속이란 Inheritance ( 상속 ) 가 아닌 Extends ( 확장 ) 를 뜻하는 것이다.

 

 

여기서 오해가 생길 수 있는 부분이 있다.

 

상속은 ' ~ is a ~ ' 관계를 만족해야 한다?

 

예를 들어보자

호랑이 is a 동물

" 호랑이는 한 마리의 동물이다. " 라고 해석하는 것이 맞지만 자세히 살펴보자

 

펭귄과 동물 모두 클래스다. 

그러나 한 마리의 동물은 클래스가 아니라 객체다.

 

다시 상속은 is a 관계를 만족해야 한다는 말에 주어와 보어로 상위, 하위 클래스를 넣어보자.

그러면  is a 관계의 완벽한 표현은 다음과 같을 것이다.

하위 클래스 is a 상위 클래스

 

하위 클래스는 하나의 상위 클래스이다 ? 

하위 클래스와 상위 클래스는 모두 분류/집단이지만 하나의 상위 클래스는 하나의 객체이다.

삼단 논법에 의거해 ' 하위 클래스는 하나의 객체이다. ' , 즉 ' 하위 집단은 하나의 유일무이한 존재다. '

이렇게 되며 논리가 성립되지 않는다.

 

그렇다면 상속 관계의 더 명확한 영어 표현은 무엇일까? 

바로 is a kind of 관계다.

 

하위 클래스 is a kind of 상위 클래스

독수리 is a kind of 조류 
  -> 독수리는 조류의 한 분류다.

독수리 is a kind of 동물
  -> 독수리는 동물의 한 분류다. 

조류 is a kind of 동물
  -> 조류는 동물의 한 분류다.

 

아래 세 문장을 꼭 기억하자 

객체 지향의 상속은

상위 클래스의 특성을 재사용하는 것이다.

상위 클래스의 특성을 확장하는 것이다.

is a kind of 관계를 만족해야 한다.

 

 

자바는 다중 상속을 지원하지 않는다

 

아주 대표적인 예로 인어가 있다.

인어가 사람과 물고기를 다중 상속했다고 생각해보자.

그러면 아래와 같은 문제가 생긴다.

 

사람 이라는 클래스에도 수영하다 가 있고 물고기라는 클래스에도 수영하다 가 있으면

둘 중 어느 클래스의 수영 방법을 상속 받아야 할까?

 

이와 같은 문제를 다중 상속의 다이아몬드 문제라고 한다.

결국 다중 상속은 이러한 문제 때문에 득보다는 실이 많아 자바는 다중 상속을 포기했다.

 

그렇다고 해서 다중 상속을 아예 하지 못하도록 막아놓은 것은 아니다.

 

 

인터페이스

인터페이스는 다중 상속을 대체 하는 듯 하지만 상속과는 차이가 있다.

상속은 ' is kind of ' 를 사용하지만 인터페이스는 ' be able to '' 무엇을 할 수 있는 '  이라는 표현 형태로 만드는 것이 좋다.

인터페이스: 구현 클래스 is able to 인테페이스

해석: 구현 클래스는 인터페이스할 수 있다.

예제: 고래는 헤험칠 수 있다.



자바 API 中 

Serializable Interface : 직렬화 할 수 있는

Cloneable Interface : 복제할 수 있는

Comparable Interface : 비교할 수 있는

Runnable Interface : 실행할 수 있는

  

 

 

반응형