본문 바로가기

개발 코딩 정보 공유/안드로이드 자바 코틀린

클래스의 재사용과 상속 관계

 

 

클래스의 재사용과 상속 관계

 

 

 

상자 물음표 질문 / 이미지 / pixabay

 

 

 

 

클래스의 재사용  , has a 의 관계

 

 

같은 동작을 하는 같은 코드를 매번 만들필요는 없겠지요?(가끔 그럴때도 있긴 합니다만…)

코드를 재사용 하는 것은 객체지향언어에서 최대의 장점중 하나 입니다.

우리가 흔히 알고 있는 객체 지향의 특징중 하나인 상속 이라는 것이 있죠.

상속을 통한 재사용도 있을수 있지만 상속을 통한 관계는 부모 클래스에 매우 종속적이게 됩니다.

컴파일 시에 타입이 결정되기 때문이죠. (자식은 부모형태 이다 = child is parent )

바로 is a 관계가 성립하기 때문이죠. 클래스 내부에서 멤버 객체(클래스)들을 생성하여 필요한 조합으로 구성할 수 있고

이를 컴포지션 이라고 합니다. 클래스 내부에서 클래스 객체를 활용하는 방법이지요.

이는 has a  관계가 성립하는데요. 클래스 간에 종속성이 없고 유연한 관계를 가지게 됩니다.

private 표시자를 활용해 멤버 변수로 생성하게되면 외부의 클라이언트 개발자들은 접근 할수 없게 만드는 것이 보통의 규칙입니다. 클래스를 생성할때 상속을 활용한 방법을 고려하기전에 우선적으로 컴포지션을 활용하여 개발하여야 합니다. 특정 클래스에 깊이 종속된 설계는 지양 하는것이 좋습니다.(라고 스앵님들이 말씀하십니다. )

 

 

 

상속 관계, is a 의 관계

 

 

재사용의 관점으로 본다면 기존의 클래스를 복사해서 새로운 클래스로 복/붙 한다면 이게 재사용 입니까?

그럴수 있지만 객체지향 관점에서의 재사용은 이런게 아닙니다 ^^;;;

OOP에서는 관계의 정의가 중요한데요. 상속이라는 개념에서는 

상위객체와 하위객체가 존재합니다. 현실세계를 빚대자면 부모와 자식간의 관계이지요.

소스상에서는 이런식으로 표시됩니다.

 

Class 아들 extends 부모 {

...

}

 

 

 

이 코드는 부모의 속성과 행동을 나도 물려받아서 쓰겠다 라는 말과 같습니다.

UML 상으로는 화살표로 표시합니다. [부모] <- [자식]

여기서 꼭 알아야 할 중요한 점이 있는데요. 바로 타입에 관한 것 입니다.

자식 클래스 들은 부모의 기능을 가지게 되며 , 부모의 인터페이스를 그대로 가지게 됩니다.

이 말은 같은 자식클래스는 부모의 형태를 띄게 되는 것이지요.

즉. 부모 객체에 보낼수 있는 메세지(메서드 호출) 는 자식도 보낼수 있는것이지요.

이는 부모객체를 자식으로 대체할수 있는 is a 관계가 성립하게 된다는 말입니다.

상속관계는 객체지향에서 굉장히 중요한 부분이지만 이를 막? 사용하면 정말 복잡하고 유연하지 않은 코드가 생성되게 됩니다. 클래스의 상속은 정확한 설계에 입각하지 않으면 만들지 말라. 라는 말도 있습니다. (제가 한말 아니구요…^^;)

실제로 자바의 아버지 제임스 고슬링은 이런말까지 남겼습니다.

자바를 다시 만들면 뭘 바꾸겠냐는 질문에 …

 

“클래스의 상속을 없애고 싶다” 라고 말했다고 합니다.

(interface 사용을 지향하도록)

 

그만큼 클래스의 상속관계를 정확하게 설계하고 사용하기란 꽤 어려운 일이 아닐까 생각해봅니다. 

훌륭한 디자인 패턴의 소스들을 보더라도 대부분이 인터페이스를 활용하고 있는걸 보면 말이죠.

그럼 이만…