본문 바로가기

Project

소프트웨어에서의 추상화 그리고 상속,다형성,캡슐화

 써니님의 추상화에 대한 글에 제글이 인용되어 있기에 다시한번 제 생각을 정리해야할듯 해서
글을 씁니다.   

 1. 추상화는 무엇?

 이전의 글(추상화와 실용주의)에서 언급했듯 추상화란 인간의 본능이자 특성입니다.
우리를 둘러싼 복잡한 환경에서 좀더 현명한 판단을 위해 사물을 단순화 시키는 것을 말합니다.
우리는 추상화를 통해 사물의 특성을 뽑아내고 불필요한 부분을 제거합니다.
하지만 이런 추상화를 하는데 있어 중요한것은 하위 개념을 포함하는 개념을 추출하는데 있습니다.

 2. 객체 지향이란?

 객체지향이란 아래의 두가지 측면으로 생각해볼수 있습니다. 
 
 a. 철학적인 측면
  플라톤의 이데아론에서 말하듯 우리를 둘러싼 모든 것들은 이상의 것(이데아)에서 파생한것(객체)이라
보는데서 클래스와 인스턴스의 관계를 나타낼수가 있고, 또는 모든 사물을 객체로 보고 객체간의 메세지를 
주고받는 개념(세포)으로 보는 관점등이 있습니다.
   
b. 설계와 구현의 측면
-객체지향 분석 및 설계(OOAD (Object-oriented analysis and design))
 실세계를 정의하기위한 기술로서의 객체지향을 말할수 있습니다.
해결하려는 실세계의 문제를 분석, 정의, 분류를 한뒤 구현을 위한 설계까지의 단계를 말합니다.

-객체지향 구현기술
 객체지향적 개념을 구현하는데 있어 도움주는 언어적 지원 , 기술등을 이야기합니다.
객체지향 언어, 디자인패턴등 구현에 관련된 모든 기술을 말합니다. 

 3. 상속 , 다형성 , 캡슐화?

 일반적으로 객체지향적을 이야기하며 말하는 세가지 개념이지만 얼마전 강규영님이 언급했듯 
객체지향이라는 패러다임에서 갑자기 나온 새로운 개념들은 아니라고 생각됩니다.
제가 보는 측면은 실용주의 입니다. 즉 위의 모든것은 개념은 실용적인 측면에서 나왔다고 보는 입장입니다.

 a. 상속은 재사용성?
 상속은 재사용의 측면에서 이해할수 있습니다.
상속은 같은 동작을 하는 코드를 쉽게 재사용하여 수정할수 있도록 도와줍니다.
하지만 일반적으로 재사용은 상속을 이용하지 않아도 가능하며 여러 문제점을 불러 일으키기에
최근에는 구성을 활용하는 것을 추천하지만 상속도 적절히 사용하면 쉽게 문제를 해결하는 
방법이 될수가 있습니다.

b. 다형성은 결합도?
 복잡하게 얽혀있는 소스코드들 사이에 존재하는 결합도를 줄이기 위해서 도입된 개념입니다.
한가지 통로를 통해 같은 행동을 하는 객체들을 제어할수가 있습니다.  


c. 캡슐화는 복잡도
 캡슐화에 대해서는 이전 접근제한자에 대해 쓴 글에서 언급했듯, 다른 소스코드를 이용함에 있어서
알 필요가 없는 정보를 숨기며 필요한 인터페이스만을 제공해 복잡도를 제어하는 기술입니다.
 우리가 다른사람의 소스 코드 및 라이브러리를 사용함에 있어서 인터페이스 정보만 알고도 이용할수
있는 것은 이 개념에 의해서 입니다.


d. 그밖에.. interface , abstract 
 Interface 및 Abstract에 대해서는 예전에 쓴 글에서 언급했듯, 
순전히 다형성과 상속을 구현하기 위해서 도입된 개념입니다.(없어도 객체지향을 구현하는데는 문제없습니다.)
 하지만 앞서언급한 글에 나타나있지않은 다른 측면은 강제구현에 있습니다.
즉 많은 사람들이 함께 개발함에 있어서 구현에 제약을 강하거나 , 강제함으로서
개발 생산성과 질을 높일수 있습니다.




 위의 abcd에서 말한 개념들은 객체지향 언어마다 다른 방식으로 구현되어 있습니다.
 또 위의 글은 어디까지나 제가 보는 관점의 이야기입니다. 
사물을 보는 방법은 여러가지가 있을수 있다고 생각합니다.
 객체지향을 IF문의 제거로 볼수도 있고, 단일지점제어의 관점으로 볼수도 있듯 정답은 없다고 생각하네요.