본문 바로가기

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

객체지향의 탄생-객체지향과 절자지향

 

  1. 객체지향과 절차지향

세상의 모든 사물을 프로그래밍 한다면 속성과 행동 두가지 요소로 표현한다. 세상의 모든 사물을 오직 두가지 요소로만 표현하는 원리는 마치 0과 1만으로 모든 수를 다룰 수 있는 2진법처럼 명쾌하고 간결하게 느껴진다. 절차지향이던 객체지향이던 프로그래밍 대상의 구성 요소를 오직 속성과 행동으로 간결하게 구분지어 개발할 수 있다는 사실을 이해하면, 우리가 프로그래밍 기술을 너무 복잡하고 어렵게 생각하고 있는 것이 아닌지 되돌아 보게 된다.

 

프로그래밍에서는 세상의 모든 사물을 속성과 행동으로 분석한다. 프로그래밍 세계관(패러다임)에 따라서 속성과 행동을 절차지향에서는 데이터와 함수로, 객체지향에서는 속성과 메소드로 불린다.

 

 

절차지향은 농민들이 공동으로 농장을 경영하는 것과 같다. 농민은 문제를 해결하는 함수이고 농장은 어플리케이션이다. 무질서하고 원시적 농사 방법을 버리고 공동 농장으로 진화하는 과정은 공동 농장 설계자들의 다음의 발견을 통해 이루어졌다. 모든 농사는 처리, 판단, 반복의 제어구조 라는 세가지 농법 만으로도 훌륭하게 경작 할 수 있다 라는 단순한 원리를 알게된 것이다.

 

이런 탁월한 설계 방법을 보고 받은 당시 군주들은 '절차지향 경작법'이라 이름 붙이고 대대적인 신기술 보급과 개혁을 시작했다. 공동 농장인 절차지향 경작지의 책임자(Project Managers)들은 농민들에게 철저한 업무 배분을 실시했다.

 

농민A그룹이 땅을 갈고 나면 농민 B그룹이 씨를 뿌렸다(처리). 만약 경작해야할 땅이 더 있으면(판단), 방금 전의 작업을 (반복)한다. 앞의 작업을 몇 번 반복하다가 씨뿌리기 작업이 완성되면 농민A, B그룹은 잠시 쉬고 농민C그룹이 땅을 고르게 정리했다. 그리고 농민D그룹이 씨앗에 물을 뿌린다. 만약 경작할 땅이 또 있으면, 방금 전의 작업을 반복하는 방식으로 농장을 경영했다.

 

절차지향 경작지 안의 모든 농민들은 경작지 안의 모든 작물의 상태를 알고 공동으로 관리했다. 공동으로 농장을 경영한 결과 경영 총책임자는 농민을 상대로 체계적인 업무분담이 가능했다. 경작 과정은 별다른 낭비 없이 효과적으로 진행되었다. 절차지향 경작지의 책임자가 보기에도 모든 경작 프로세스가 처음 계획대로 깔끔하게 정리되고 있었다. 효과적인 통제가 가능하다 믿었고, 부농이 되는 길은 멀지 않아 보였다.

 

절차지향 경작지의 책임자는 꿈에 부풀어 경작지를 확대했다. 더 많은 농민들을 끌어 모았다. 책임자는 평소 하던대로 모든 작물의 생육 상태를 모든 농민들이 알고, 각각의 기본 임무대로 처리, 판단, 반복의 절차를 수행하도록 지시했다. 그런데 작은 농장에서는 잘 실시되던 경작 프로세스에 문제가 생겨나기 시작했다.

 

절차지향 경작지가 워낙 넓어지다 보니 수많은 작물의 상태를 제대로 관리하기 어려워졌다. 작업이 진행될 따마다, 엄청난 분량의 작물 성장 기록을 체크하고, 잡초와 벌레가 난 작물들을 솎아내느라, 책임자와 농민들은 서서히 지쳐갔다. 농민들은 관리자들이 지정한 땅에서 시키는 일만 하고, 다른 농민과 교류할 기회가 없다 보니 숙련된 기술을 다른 농민에게 전수할 기회도 없었다. 농장이 커져감에 따라 새롭게 채용된 농민들은 자신들이 해야할 일이 무언지도 잘하는 방법이 무언지 전수받지 못하고 우왕좌왕 하기 시작했다.

 

농장이 커짐에 따라 여기저기서 많은 농민을 급히 끌어 모았더니, 미숙한 농민들이 작물을 망치는 경우가 빈번했다. 미숙한 농민들의 더 큰 문제는 농민들끼리의 임무가 순서대로 긴밀하게 연결이 되어 있기 때문에 앞의 순서에서 일하는 농민이 실수를 하면 뒤에서도 연달아 실수가 일어나는 경우였다. 결국 비극이 발생했다. 농민E그룹은 식수원을 관리하는 임무를 수행했는데, 그들의 실수로 식수원에 폐수가 흘러들었다. 그리고 씨앗에 모든 작물에 물을 공급하는 역할을 수행하는 농민D그룹이 씨앗에 폐수가 섞힌 물을 뿌렸다. 결국 모든 작물이 말라 죽어 버렸고, 절차지향 경작지는 순식간에 폐허로 변했다. 화를 달랠길이 없었던 책임자는 농민E, D그룹(함수)을 해고해(삭제)버렸다. 그리고 책임자 자신도 해고(삭제)당했다.

 

절차지향 경작지의 교훈을 거울삼아 농장 전문가와 연구소들은 새로운 경작 방법을 고안하기 시작했다. 세상의 이치와 인간의 사고 방식를 연구한 그들은 한 사람이 한꺼번에 수많은 작물을 관리하기 것은 지나치게 부담스럽다는 사실에 공감하고, 책임질수 있는 작은 범위의 작물만 관리하는 것이 더 효과적이라는 것을 발견했다. 객체지향은 농민들이 농장 내에서 자신 소유의 땅을 배정받아 경작하는 것과 같다. 또한 작물의 이익을 농민에게 나눠줄 경우 더욱 더 책임감을 가지고 자신의 일을 더욱 잘할 것이라는 심리학적인 연구도 병행되었다.

 

 

학자들은 농민들이 자신 소유의 땅으로 농장을 경영하는 새로운 경작 방법을 군주에게 제안 했다. 군주는 '객체지향 경작법'이라는 이름을 지어 공포하고 새로이 시행에 옮겼다.

 

농민들에게 일정 분량의 경작지 소유가 허용되었다. 그들은 자신의 땅에 자신이 제일 잘 키울 수 있는 작물을 선택해 책임감과 정성을 다해 작물을 키우기 시작했다. 농민들은 독자적으로 경작하면서, 자연스럽게 서로간에 관계를 형성하기 시작했다. 동료의 경작지를 도와주고 동료의 작물을 가져다 쓰기도 하고, 자신의 작물을 제공해주기도 했고, 서로 좋은 기술도 주고 받았다. 농민들이 후계자를 키우고, 경작 기술을 전수해주기도 했다. 농민들과 후임자 간의 자연스러운 관계가 형성되었고 자유롭게 서로가 가진 정보(메시지)를 주고 받았다.

 

농민들에게 제한된 책임을 부여하는 대신 관리하는 책임자는 농민들에게 제일 잘 키울수 있는 작물을 제시해줄 필요가 있었다. 왜냐하면, 농민들간에 효과적인 관계를 형성하고 협동하여 더욱 더 큰 경작지를 일구어갈 필요가 있었기 때문이다. 또한 관리자는 농민들의 작물을 잘 정리하고 가공하여 나라에 바치는 임무도 수행했다. 농민들끼리나 농민과 자식 간에 경작 기술을 잘 전파하여 그들의 기술이 발전된 방향으로 재사용되게끔 유도하는 임무도 수행했다. 유능한 책임자는 이런 임무를 잘 수행하여 토지는 비옥하고 농민도 잘 살고 책임자와 나라도 잘사는 이상계를 건설하였다.

 

그러나 현실에 안주하고 노력을 게을리하는 일부 책임자는 이런 깊이있는 생각과 공부와 노력이 요구되는 임무를 하려고 들지 않았다. 어느 농민에게는 능력을 넘어서는 수많은 작물을 책임지라고 요구하고 다른 농민은 쥐꼬리만한 땅만 주었다. 농민들끼리의 관계를 따져보지도 않고 서로 싫어하는 농민들끼리 협동해서 일하라며 억지로 관계를 맺기도 했다. 심지어는 농민 주제에 왜 땅을 내 주고 스스로 일하게 하냐며 투덜거렸다. 땅은 모조리 내꺼라고 하면서 농민의 땅을 압수하고 절차지향 경작법처럼 농민을 수동적으로 다루기도 했다.

 

 

절차지향은 함수가 전역변수를 함께 다룬다. 함수는 주어진 문제를 해결하면서 전역변수를 변경한다. 처음 어렵고 원시적인 프로그래밍 방법론에서 절차지향으로의 진화하는 과정은 소프트웨어 학자들의 다음의 발견이 기초가 되었다. 모든 프로그램은 처리, 판단, 반복의 3가지 제어구조만으로도 프로그래밍이 가능하다는 것을 발견한 것이다. 그래서 3가지 제어구조를 이용하는 절차지향 언어가 발달하게 되었다.

 

예를 들어 '농장 경영 프로그램'을 절차지향 언어로 구현해 보았다. '땅을 가는 함수A'가 땅을 갈고나면(처리), '씨를 뿌리는 함수B'가 씨를 뿌렸다(처리). 만약 경작해야할 땅이 더 있으면(판단), 방금 전의 작업을 (반복)한다. 앞의 작업을 몇 번 반복하다가 '씨뿌리기 작업'이 완성되면(판단), '땅으로 고르게 정리하는 함수C가' 땅을 고르게 정리했다(처리). 그 다음 '씨앗에 물을 뿌리는 함수D'가 씨앗에 물을 뿌린다(처리). 만약 경작할 땅이 또 있으면(판단), 방금 전의 작업을 (반복)하는 방식으로 프로그램을 구현하였다.

 

'농장 경영 프로그램'안의 모든 함수들은 '작물'이라는 전역변수의 상태를 알고 공동으로 제어 했다. 함수별로 임무를 분담하고 처리, 판단, 반복의 3가지 제어구조를 이용하여 효과적으로 프로그램을 구성한 결과 '농장 경영 프로그램'은 부드럽게 작동되고 있었다.

 

'농장 경영 프로그램' 의 요구사항이 추가되었다. 더 많은 함수들이 필요 했다. 절차지향 언어 개발자는 함수들을 추가하고 다시 프로그램을 구현한다. 그런데 문제가 발생하기 시작했다.

 

함수를 워낙 많이 작성하고, 그 함수들이 전역변수를 공동으로 제어하다보니, 프로그램 개발중 버그가 발생했을때, 어디서 전역변수가 꼬였는지 추적하기 어려웠다. 앞의 함수가 잘못되면 뒤에서 실행되는 함수의 작동도 꼬이기 시작했다. 개발자는 버그 추적에 지쳐서 작은 버그 하나를 놓쳤는데, 이 작은 버그는 당장은 눈에 띄지 않지만 오래 실행되면 점점 버그가 커지는 상황이었다. 결국 어느 순간 전역변수가 완전히 꼬여버렸고, '농장 경영 프로그램'은 다운이 되었다.

 

 

세상의 이치와 더욱 바람직한 프로그래밍 방법을 연구한 소프트웨어 학자들은 속성과 기능이 서로 관련있는것들끼리 묶을 경우가 더 효과적이라는 것을 발견했다. 속성과 기능이 합쳐 객체가 되는데 그 객체가 자신이 가장 잘할수 있는 하나의 일을 잘한다, 고 가정할 경우 절차지향보다 더 '응집도는 높고 결합도는 낮게' 프로그램을 구성하는게 가능했기 때문이다.

 

다시 '농장 경영 프로그램'을 객체지향 언어로 구현해 보았다. '땅을 가는 객체'는 땅이란 속성만 책임지고 관리하면 되었고, '씨를 뿌리는 객체'는 씨라는 속성만 책임지고 관리하면 되었다. 또한 씨를 뿌리기 위해 씨 뿌릴 땅을 알아야 했기 때문에 자연스럽게 서로간에 관계를 만들었다.

 

대신 '농장 경영 프로그램' 개발자는 최초 객체가 하나의 일만 제일 잘해서 높은 응집도를 구축하고, 객체끼리 결합도가 낮게 관계를 맺을 수 있도록 하는 지속적인 노력이 필요했다. 여기서 객체지향 언어 개발자의 숙련된 능력이 요구된다. 어떤 개발자는 이런 작업을 잘 진행하여 객체지향으로 개발할때 얻을 수 있는 유연성과 확장성의 장점을 얻는데 성공하고, 다른 개발자는 이런 작업이 서툴러서 오히려 절차지향 보다 못한 프로그램을 구성하곤 했다.

 

 

절차지향 언어는 소규모의 문제를 해결할때 여전히 좋은 방법이다. 하지만 속성을 전역 변수로 관리하기 때문에 대규모 프로젝트에서 어느 함수가 전역변수를 건드리는 큰 문제를 발생시킬지 알 수 없다. 또한 라이브러리를 구축해 함수를 재사용할수 있지만, 객체지향 언어가 더 간편한 재사용 절차를 제공한다.

 

객체지향 언어는 매력적인 방법이다. 속성과 행동을 묶어 하나의 객체가 책임지고 관리한다. 객체가 소중한 속성을 보호하기 때문에 속성을 안전하게 관리한다. 또한 간단한 기법으로 다양한 기능을 재사용한다. 그러나 객체지향 언어는 절차지향 언어에 비해 다루기 어렵기 때문에 객체지향 언어의 특성과 효과를 잘 연구한 다음 시행해야 한다. 자동차가 자전거보다 빠르고, 복잡하고 먼 길을 갈 수 있지만 배우는데는 더 많은 시간이 걸리는 것과 같은 이치다.

 

객체지향 언어는 완성된 기술이 아니기 때문에 좀 더 진화해야 한다. 객체지향 언어 자체의 진화 보다는 객체지향 언어를 사용하는 책임자들의 역량이 강화되어야 한다. 아무리 좋은 기술도 제대로 이해하지 못하고 쓰면, 기술을 쓰지 않는 것보다 더 큰 문제를 불러 온다.

 

[절차지향의 단점]

 

[객체지향의 특징]

 

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