본문 바로가기

기타/객체지향 토막글

수필 객체지향, 객체지향과 추상화

객체지향 개발에 익숙한 개발자들이 있다. 그들은 자신이 제일 잘쓰는 에디터를 구동하는 순간부터 저절로 객체지향적인 코딩이 진행된다. 그러나 갑자기 객체지향 코딩에 익숙한 개발자에게 ‘객체지향’ 개발이란 무엇인가요? 그리고 왜 객체지향적으로 개발을 하는건가요? 객체지향적으로 개발한다는 것은 어떤 뜻인가요?라고 호기심 가득한 신입 후배가 묻는다면 갑자기 머릿속이 가비지 컬렉터 되면서 아무 생각도 떠오르지 않지 않을까 짐작된다. 질문에 왠지 명쾌하게 답하기가 어렵기 때문이다.

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

객체지향 개발자들이 업무 대상으로부터 처음 개발을 시작할때 일단 세상의 어떤 요소를 객체로 만들것인지 추출하는 과정을 먼저 진행한다. 다음 객체의 속성과 메소드를 추출하는 것이 다음순서로 진행된다. 이것은 어떤 나무를 심을지 결정하는 미시적인 관점이다. 다음 객체와 객체들을 어떻게 관계 맺을지 설계하는 과정을 거친다. 이것은 숲을 어떻게 꾸밀지 결정하는 거시적인 관점이다.

업무 대상으로부터 객체를 추출한다. 객체의 속성과 메소드를 추출한다. 객체간의 관계와 구조를 결정짓는다. 객체를 추출하는 것도 추상화고, 객체의 핵심적인 속성과 메소드를 추출하는 것도 추상화고, 객체와의 관계를 결정지을때도 추상화 작업이 진행된다. 업무 대상으로부터 객체를 추출하는 일과, 객체의 속성과 메소드를 추출하는 일과, 객체와의 관계를 따져 좀더 추상적인 객체를 상위 계층으로 추출하는 작업등의 모든 객체지향 설계에는 추상화 사고능력이 요구된다. 그래서 이 모든 객체지향 설계 작업은 개발자가 얼마나 대상을 잘 추상화할 수 있느냐에 따라 작업의 성공 여부가 결정된다.


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

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


지금까지 사고 과정을 통해 객체지향과 추상화의 관계와 정의에 대해 알게 되었다. 그럼 좀더 나아가 객체지향 개발로 추상화시 얻을 수 있는 유연함과 확장성과 유지보수 편리함등은 어떻게 얻을 수 있는가에 대해 다시 골몰하였다.
 
[전형적인 상속과 합성 구조]
    
객체지향 개발로 추상화시 얻을 수 있는 장점은 주로 ‘상속과 폴리모피즘’ 또는 ‘상속과 합성’ 또는 이 방법들을 활용한 ‘객체지향 디자인 원칙’과 더 나아가 세련된 ‘디자인패턴’을 통해 얻게 된다. 상속, 합성, 폴리모피즘은 이렇게 쓰인다. 위의 그림의 '휴대폰 인터페이스'와 같이 객체 패밀리의 본질을 핵심적으로 나타내는 중요한 속성과 기능을 추상화하여 부모 클래스 또는 인터페이스로 선언한다. 밑에는 '블랙잭', '아이폰'처럼 구상 클래스를 위치시킨다. 옆에 '클라이언트'는 추상 클래스에만 의존하게 된다. 더 나아가 위의 그림처럼 ‘통신방법’ 같이 변하는 로직을 별도의 합성 구조로 캡슐화시키면 언제든지 새로운 로직을 변경 확장할수 있다.

전형적인 이런 객체지향 구조는 입맛에 맞게 구상 클래스를 교체하여 쓸수 있기 때문에 유연하다. 새로운 로직이 요구되면 해당 인터페이스를 상속받는 새로운 클래스를 확장하면 되니 확장성이 높다. 유연하고 확장성이 높기 때문에 결국 유지보수가 편리하다.
 

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


산골이 덧) 이 글은 수필 객체지향이라는 책쓰기용 원고의 일부라서 펌은 불허합니다. 이 글의 원고는 1차로 쓴것을 그대로 올려서 다듬어지지 않았습니다. 못써도 이해해주시고요. 지금 올리는 것은 공부한것을 독자와 공유하고 객체지향 개발자님의 조언을 받기 위해서입니다. 혹시 내공이 부족해서 미흡한 내용이 있을것 같습니다. 그래서 혹시 시간되시면 조언 부탁드립니다. ^ ^; 그리고 관심있는 출판사 관계자분의 연락도 환영합니다. I출판사만 믿습니다. ^ ^;