본문 바로가기

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

객체지향의 탄생-객체지향의 탄생


  1. 객체지향의 탄생

사람은 관찰한다. 눈으로 세상을 보고, 귀로 소리를 듣고, 코로 냄새를 맡고, 혀로 맛을 느낀다. 덕분에 사람은 세상을 있는 그대로 받아들이는 능력을 가졌다.

 

사람은 세상을 있는 그대로 받아들이진 않는다. 나에게는 아름답게 눈 덮힌 거리가 누군가에게는 귀찮은 노동거리로 보인다. 나에게는 감미로운 음악 소리가 누군가에게는 수면을 방해하는 소음으로 들린다. 나에게는 맛있는 고기 냄새가 누군가에게는 불쾌감을 준다. 나에게는 맛있는 불 닭발이 누군가에게는 매운 음식으로 인식된다. 사람이 보는 세상의 모든 것들은, 사람의 관찰 도구 '이목구비'를 통해 객관적으로 인식되었다가, 사람의 '생각'을 통해 주관적으로 덧씌워져서, 각자의 이미지로 재 탄생한다.

 

객관적인 관찰도구 이목구비가 사람의 사고를 거쳐 주관적으로 바뀌었기 때문에 사람의 관찰능력은 정확하지 못하고 미덥지가 못하며 의견충돌의 원인이 되었다. 그러나 사람의 주관적인 관찰 습관 덕분에, 세상에 대한 다양한 관점의 관찰이 가능했고, 깊이 있는 관찰이 가능했다. 각자 창의적이고 위대한 문명을 이룩하게 되었다.

 

세상을 있는 그대로 보지 않고 '다양하게' 관찰한다는 것은, 우리 인류가 같은 분야라도 다양한 문명으로 발전하는데 기여했다. 서양에서 의학은 정신과 육체를 분리하고 증상 부위에 집중하는 과학적인 학문으로 발전했다. 한의학은 정신과 육체를 하나로 보고 증상의 근본 원인을 처방하는 학문으로 발전했다. 음악, 미술, 과학도 각 문명에서 독창적으로 발전했다. 이것은 사람이 세상을 관찰하는 방법이 저마다 약간씩 다르기 때문이다.

 

세상을 있는 그대로 보지 않고 '깊이 있게' 관찰한다는 것은, 우리 인류가 깊이 있는 문명으로 발전하는데 기여했다. 세상의 본질을 추적 하다보니 수학이 발달했고, 과학이 발달했고, 그 결과 화산이 폭발하면서 퍼지는 화산재처럼 비행기, 배, 자동차, 현대 건축물, 컴퓨터등의 수 많은 부산물들이 발전하기 시작했다. 그중에 컴퓨터는 세상을 0과1로 극도로 추상화, 단순화 시키는데 성공한 대표적인 산물이다. 우리는 0과1로 세상의 모든 것을 컴퓨터로 담아 빠르고 편하게 세상을 관찰하고, 움직이고, 행동할 수 있게 되었다.

 

이제 우리는 세상을 0과 1로 편하게 담는 방법을 찾기 시작했다. 0과 1을 그대로 표현하는 방법은 차라리 뙤약볕에 망치들고 노가다 하는것이 더 편하게 느낄 정도로 힘든 노동이었다. 조금 편하게 기호화 시켜 어셈블리어가 만들어 졌다. 대중성과 실용성의 중간을 찾다보니 C언어가 만들어졌다. 좀더 대중적인 표현 방법을 찾다보니 베이직이 만들어졌다. 하지만 Goto문으로 가득찬 소스를 분석하다보니 머리가 어지러워 쓰러질 지경이다.

 

대중성과 실용성을 두루 갖춘 C언어가 인기를 끌었다. C언어는 데이터와 메소드를 분리하고 절차를 중요시 하는 구조적 프로그래밍 언어였다. 이 방법은 모듈화, 각개격파를 통한 문제해결에 도움을 주었다. 그러나 대규모 프로젝트에서 데이터 관리의 어려움이 발견 되었다. 좀더 좋은 방법을 찾기 시작했다.

 

객체지향 이전의 C언어등의 구조적 프로그래밍으로도 어느 정도 원하는 프로그래밍이 가능 했으나, 문제는 겉으로 보이는 기능의 완성도 보다는 내부에 있다. 내부 소프트웨어의 복잡도, 유지보수가 얼마나 편한지, 확장하기 얼마나 쉬운가, 재 사용성이 높은가 등을 따져보면 구조적 프로그래밍은 유지보수가 쉽지 않아 소프트웨어 관리 비용이 늘어났다.

 

객체지향은 유연하고 확장하기 쉽고 유지보수가 편리한 개발을 위해 탄생했다.

 

먼저 객체란 무엇인가? 객체의 사전적인 정의는

 

'객체 지향 프로그래밍이나 설계에서, 데이터(실체)와 그 데이터에 관련되는 동작(절차, 방법, 기능)을 모두 포함한 개념.

 

예를 들어 기차역에서의 승차권 발매를 생각할 때, 실체인 '손님'과 동작인 '승차권 주문'은 하나의 객체이다. 실체인 '역무원'과 동작인 '승차권 발매'도 하나의 객체이다.'

 

그리고 객체지향 프로그래밍의 사전적인 정의는

 

'독립적인 각각의 객체로 프로그램이나 시스템을 구성하는 일.'

 

그렇다면, 내가 생각하는 객체지향 프로그래밍은

 

'독립적인 각각의 객체를 이용, 각 기능간의 의존성은 줄이고 내부 기능을 강화하는 식으로 프로그램이나 시스템을 구성하여, 개발을 깔끔하게 진행하고 편하게 유지보수 하고 기능을 쉽게 확장할 수 있는 품질 좋은 S/W를 지향하는 개발 기법이다'

 

 

나는 생각의 탄생이란 책을 읽고 객체지향을 다시 이렇게 정의 했다.

 

'세상의 사물을 관찰하여 사물의 본질을 속성과 메소드를 포함한 객체와, 객체간의 관계로 추상화 한다.'

 

'그래서 응집도를 높게하고 결합도는 낮게 개발한다.'

 

'그 결과 유연하고 확장하기 쉽고 유지보수가 편리하는 소프트웨어를 개발하는 방법'

 

이 객체지향 개발이고 객체지향 개발에 따른 효과이다.

 

나아가,

 

'객체와 객체간의 관계에서 반복적으로 발견되는 좋은 원칙을 이끌어 내어 패턴으로 만들어낸 '

 

다자인 패턴이다.

 

[객체지향을 잘 알면 좋은 코드를 만들 수 있다.]


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