본문 바로가기

길게 쓰기/객체지향의 탄생 (공식)

객체지향 생각의 도구3-한두깨 객체지향 프로그래밍 미리보기

한번 읽고 두번 깨닫는 객체지향 프로그래밍 미리보기


책이 2019년 1월말에 출간 예정인데 블로그 독자들에게 미리보기를 제공합니다.


보시고 댓글과 질문 많이 남겨주시면 감사합니다. +.+



4) 관찰 → 추상화 → 패턴인식

이제 관계의 의존성은 낮추고 기능의 집중도는 높인다는 객체지향의 장점을 살리려면 우리는 어떻게 접근해야 할지 알아본다. 예를 들어 2차 세계 대전 비행기 시뮬레이터를 객체지향 프로그래밍으로 구현하기로 했으면, 비행기를 어떻게 객체지향 프로그래밍으로 풀어 가는지 같이 살펴본다.

 

① 비행기란 사물을 살펴보자. 우리는 사물을 보면 먼저 어떻게 생겼는지 관찰부터 한다. 비행기를 객체지향 프로그래밍으로 구현 하기 위해서, 우리는 비행기를 먼저 관찰한다. 비행기를 앞에 두고 관찰하면서 우리는 객체지향 코드로 어떻게 구현할지 고민한다. 일단 이렇게 비행기의 특징을 자유롭게 발견 할 수 있다.

 

동체, 날개, 꼬리, 엔진, 이착륙장치, 바퀴, 전투 장비, 계기판, 속도 증감 장치, 바퀴 조종 장치, 무기 발사 장치, 조종사 생명 유지 장치, 통신 장치 등등

 

위의 개발 진행 과정을 아래처럼 정리할 수 있다. 객체지향의 최소 단위는 객체이다. 요구사항을 해결하려는 과정에서 객체들이 하나 둘씩 생성된다. 우리는 요구사항을 어떻게 소프트웨어로 구현 할까라는 관점에서 구현해야 하는 사물(전체 요구사항 또는 하나의 개별 요구사항)을 주의 깊게 관찰한다. 이런 요구사항을 유심히 관찰하다 보면 객체로 만들 수 있는 각종 데이터를(여기서의 데이터는 데이터(속성)와 기능(행동)을 모두 합친 뜻으로 쓰였다.) 뽑을 수 있다. 다만 이 데이터들은 당장 코딩하기에는 아직 체계적으로 정리되진 않아서 명확하지 않다. 이 사물의 관찰 과정에서 드러나는 데이터들은, 사물의 중요한 특징을 누락하지 않아야 한다. 그러나 이 특징들이 지나치게 많아 과잉정보가 되어, 사물의 판단과 해석에 지장을 주어서는 안된다. 이 과정에서는 사물(사물이나 현상, 여기서는 비행기)을 주의 깊게 자세히 살펴보는 사고력이 필요하다. 이 사고력이 관찰이다.

 

② 위에서는 비행기의 특징을 자유롭게, 한편으로는 무질서하게 추출했다. 우리는 본격적인 객체지향 개발을 위해 이 특징들을 체계적으로 정리하는 작업을 했다.

              

첫 번째 사고 : “비행기 몸체가 있어야겠다.

동체, 날개, 꼬리, 엔진, 바퀴, 전투 장비

 

두 번째 사고 : “비행기 제어와 관련된 장치가 있어야겠다.

속도 증감 장치, 바퀴 제어 장치, 무기 제어 장치, 이륙/착륙 제어 장치, 통신 장치

 

세 번째 사고 : “이 비행기 몸체와 제어 장치를 조종할 수 있는 조종석이 있어야겠다.

계기판, 조종사 생명 유지 장치

 

이 과정을 통해 비행기의 특징들을 분류해서 우리 개발자들이 수월하게 비행기 사물을 바라 볼 수 있도록 단순화 했다. 이제 이 데이터 중 중요한 것을 추려내고 다시 배치하여, 이 데이터들을 요구사항과 관련해서 더 의미 있는 정보로 만들어야 한다. 이렇게 의미 있는 정보화를 통해 우리가 대상을 어떻게 구현하면 될지 명확하게 정리할 수 있고, 개발을 시작할 수 있다.

보통 관찰 단계에서 우리가 추출한 데이터가 100개라면 이중에 일부인 10개만 더 의미 있는 데이터가 되곤 한다. 이 과정에서 쓸모없는 데이터는 버릴 수도 있고, 중복된 의미의 데이터는 하나의 데이터로 합칠 수도 있다. 우리는 인식한 많은 데이터 중에 의미 있는 데이터만 가져오고 나머지는 버리게 된다. 또한, 관련된 데이터들을 모으고 합쳐 더 큰 단위의 의미 있는 정보로 만들 수 있다. 정보의 사전적인 뜻은 관찰이나 측정을 통하여 수집한 자료를 실제 문제에 도움이 될 수 있도록 정리한 지식 또는 그 자료이다.

여기서 우리는 인식한 많은 데이터 중에 의미 있는 데이터만 가져오고 나머지는 버린다. , 그리고 우리는 의미 있는 데이터들을 모아 더 큰 단위의 의미 있는 정보로 만들 수 있다. 라고 했다. 우리는 이렇게 많은 데이터 중에 의미 있는 데이터만 가려내는 사고력, 이 데이터들을 연결하여 더 의미 있는 정보로 창조하는 사고력이 필요하다. 이 과정과 관련된 사고력이 추상화이다.

 

③ 사물 또는 요구사항을 관찰과 추상화를 통해 정리해서 객체지향 프로그래밍 하다보면, 아래와 같은 경우가 생긴다.

 

- 조종석을 처음에는 단순하게 하나의 동일한 특징을 가진 클래스로 구현했다.

(동일한 특징이란 예를 들어 동일한 장갑력, 동일한 계기판 등)

- 조종석을 아이템화 해서 자유롭게 교체해야 하는 요구사항이 추가 됐다.

(파워 장갑을 가진 조종석, 고급 계기판을 가진 조종석등으로 아이템화가 필요하다.)

- 개발자는 조종석을 자유롭게 교체하도록 코드를 수정해야 한다. 되도록 좋은 코드를 적용할 수 있는 방법을 고민한다.

- 개발자는 고민과 연구를 통해, 디자인패턴중에 Strategy pattern을 적용할 수 있음을 발견한다.

- 조종석 관련 코드를 Strategy pattern으로 수정한다.

 

우리는 소프트웨어 결과물을 만드는 과정에서 종종 반복적으로 동일하게 인식할 수 있는 패턴들이 있다. 우리 개발자에게 이 패턴은 객체들 간의 관계와 관련된 패턴이거나, 반복되는 로직(=for, if문의 명령문 조합, 알고리즘)일수도 있다. 이 패턴은 나쁜 패턴(관계의 의존성은 높아지고, 기능의 집중도는 낮아지는)일수도 있고, 좋은 패턴(관계의 의존성은 낮게 돕고, 기능의 집중도는 높게 해주는)일수도 있다. 우리는 나쁜 패턴은 버리고, 좋은 패턴을 적절하게 적용할 줄 알아야 한다.

다행히 객체지향에서 객체 간의 관계를 잘 조직화 하도록 도와주는 규칙과 노하우가 존재한다. 디자인패턴리팩토링이라는 기법이다. 우리는 이 두 가지 기법을 습득하고 적용할 줄 알아야 한다. 이 과정과 관련된 사고력이 패턴인식이다.

위의 개발 과정을 통해 객체지향과 관련해서, 관찰 → 추상화 → 패턴인식의 사고 과정으로 진행하게 됨을 알 수 있다. 이제부터는 각각의 사고력에 대해 설명한다.


 Yes24: http://bitly.kr/DAg9t
 알라딘: http://bitly.kr/aSMu2
 교보문고: http://bitly.kr/utfU7
 인터파크: http://bitly.kr/ffJjy