본문 바로가기

기타/객체지향의 탄생(2013)

객체지향의 탄생- 객체지향과 추상화

 

  1. 객체지향과 추상화

생각의 탄생이라는 책을 재미있게 읽었다. 이 책은 인간의 사고를 관찰, 추상화, 패턴인식, 유추, 형상화 등의 여러 사고 능력으로 나눠 이런 사고력을 키우는 방법과 결국 이 모든 인간의 사고를 통합하여 잘 활용하는 방법의 중요성을 설명한 유익한 인문 책이었다.

 

객체지향 방법론과 구조적 프로그래밍 방법론의 차이는 생각의 접근 방법에 차이가 있지 않을까 라고 생각한 적이 있다. 구조적 프로그래밍은 각 기능의 모듈화를 잘해야 하므로 분석과 형상화를 잘해야 하지 않을까. 그리고 객체지향은 일단 세상의 요소를 객체로 추출해야 하므로 세상을 잘 관찰하고 관찰한 것들을 추상화 할 줄 아는 사고력이 필요하다고 생각한 적이 있다.

 

객체지향 개발이 어려운 개발자가 있으면 반대로 익숙한 개발자들도 있다. 객체지향에 익숙한 개발자들은 그들이 제일 잘쓰는 에디터를 구동하는 순간부터 물 흐르듯 객체지향적인 코딩이 진행될것이다.

 

그러나 갑자기 객체지향 코딩에 익숙한 개발자에게 '객체지향' 개발이란 무엇인가요? 그리고 왜 객체지향적으로 개발을 하는건가요? 객체지향적으로 개발한다는 것은 어떤 뜻인가요? 라고 호기심 가득한 신입 후배가 묻는다면 갑자기 머릿속이 '가비지 컬렉터' 되면서 아무 생각도 떠오르지 않지 않을까 짐작한다. 질문에 왠지 명쾌하게 답하기가 어렵기 때문이다.

 

그래서 저 어려운 질문에 대해 곰곰히 생각해봤다. 답은 잘 떠오르지 않았다. 한때 이 문제로 고뇌했다. 한참 후에 결국 '객체지향 개발이란 세상의 모든 요소를 객체와 객체간의 관계로 추상화 하여 추상화시 얻을 수 있는 유연함과 확장성과 유지보수 편리함등의 여러 장점을 얻기 위한 개발 방법론' 이라고 결론 내린적이 있다.

 

객체지향 설계자들이 업무 대상을 분석하기 시작한다. 일단 세상의 어떤 요소를 객체로 만들것인지 추출하는 과정을 진행한다. 객체와 객체들을 어떻게 관계 맺을지 설계하는 과정을 거친다. 객체의 메소드를 추출한다. 객체의 속성을 추출한다.

 

[개발자가 프로그래밍 대상에 대한 분석 작업할때는 추상화 과정을 포함한다.]

 

객체지향 설계자들의 업무 분석에는 '추출'하는 작업이 진행된다. 추출작업은 추상화 사고와 관련 있다. 객체를 추출하는 것도 추상화고, 객체의 핵심적인 속성과 메소드를 추출하는 것도 추상화고, 객체와의 관계를 결정지을때도 추상화 작업이 진행된다. 이 모든 작업에는 추상화 사고능력이 요구된다. 그래서 객체지향 설계 작업은 개발자가 얼마나 대상을 잘 추상화할 수 있느냐에 따라 작업의 성공 여부가 결정된다.

 

이렇게 추상화는 객체지향 개발의 밑바탕에 깔린 중요한 사고 방식이다. 언젠가 이점을 깨닫고 먼저 추상화란 용어의 정의부터 이해해야겠다라고 생각한 적이 있다. 다시 답을 얻기 위해 고뇌한적이 있다. 인류의 사고 과정을 깊이있게 연구한 생각의 탄생이란 책으로부터 단서를 얻었다. 결국 나는 '추상화란 비슷한 종류의 사물의 본질을 핵심적으로 나타낼 수 있는 중요한 속성들을 드러내는 일이다.' 라고 정의하였다.

 

여기서 추상화란 용어의 정의를 잘 음미할 필요가 있다. 뭔가 비슷한 정의를 가진 다른 단어가 떠오르는 것 같다. 바로 객체화의 정의와 비슷하다. 세상의 사물을 객체로 추출하는 객체화의 정의와 매우 비슷하다. 객체로 추출할때도 '사물의 본질을 핵심적으로 나타내는 중요한 속성을 추출'한다. 그래서 사물의 추상화 정의와 사물의 객체화 정의가 거의 완벽하게 일치하는 것을 알게 된다.

 

 

지금까지 사고 과정을 통해 객체지향과 추상화의 관계와 정의에 대해 알게 되었다. 그럼 좀더 나아가 객체지향 개발로 추상화시 얻을 수 있는 유연함과 확장성과 유지보수 편리함등은 어떻게 얻을 수 있는가에 대해 다시 생각했다.

 

[그림1.4.3-1, 전형적인 상속과 구성 구조]

    

객체지향 개발로 추상화시 얻을 수 있는 장점은 주로 '상속과 폴리모피즘' 또는 '상속과 구성' 또는 이 방법들을 활용한 '객체지향 디자인 원칙'과 더 나아가 세련된 '디자인패턴'을 통해 얻게 된다. 상속, 구성, 폴리모피즘은 이렇게 쓰인다.

 

위의 그림의 '휴대폰 인터페이스'와 같이 해당 객체 그룹의 본질을 핵심적으로 나타내는 중요한 속성과 기능을 추상화하여 부모 클래스 또는 인터페이스로 선언한다. 밑에는 '겔럭시', '아이폰'처럼 '구현 클래스'를 위치시킨다. 옆에 '클라이언트' 객체는 추상 클래스에만 의존하게 된다. 더 나아가 위의 그림처럼 '통신방법'과 '무선인터넷' 객체 구성 같이 변하는 로직을 별도의 '구성 구조'로 캡슐화시키면 언제든지 새로운 로직을 변경 확장할수 있다.

 

상속과 구성을 활용한 위의 객체지향 설계 구조는 입맛에 맞게 구현 클래스를 교체하여 쓸수 있기 때문에 유연하다. 새로운 로직이 요구되면(새로운 모델의 휴대폰 개발이 필요하면) 해당 인터페이스를 상속받는 새로운 클래스를 확장하고 기존 소스는 변경할 필요가 없으므로 확장성이 높다. 유연하고 확장성이 높기 때문에 결국 유지보수가 편리하다.

 

 

그래서 객체지향 개발이란 세상의 모든 요소를 객체와 객체간의 관계로 추상화 하여 개발하는 것이다. 객체지향적으로 개발하는 이유는 추상화시 얻을 수 있는 유연함과 확장성과 유지보수 편리함등의 여러 장점을 얻기 위한 개발 방법론이다. 그리고 상속, 구성, 폴리모피즘등의 기본 요소와 객체지향 디자인원칙과 디자인 패턴등의 객체지향관련 설계 요소를 활용하여 추상화 및 구현을 해야 비로소 객체지향적으로 개발한다고 이야기 할수 있다.

 

[속성과 메소드를 추출하는 추상화 능력, 객체간의 관계로부터 수퍼 클래스를 추출하는 추상화 능력, 더 나아가 더 바람직한 관계를 구성하는 추상화 능력을 길러야 한다.]

 

덧 ) 이 객체지향의 탄생 원고는 제가 책으로 내려다가 일단 잘 안되었는데요. 이유는 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다.등 입니다. 그래도 원고를 일단 블로그에 몽땅 풀어보고 언젠가 제대로 교정해서 다시 도전할 생각입니다. 이점을 감안해서 읽고 객체지향을 이해하는데 도움이 되셨으면 좋겠습니다. 의견도 주셨으면 좋겠습니다. 원고 조금만 교정하면 괜찮을것 같은 출판사 관계자분의 피드백도 환영합니다. 매주 월요일 발행 예정입니다.