본문 바로가기

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

객체지향의 탄생-클래스

 

  1. 클래스(Class)

객체지향이라는 어려운 IT기술을 익히기도 전에 고유명사니 일반명사니 하는 반대편 국어 개념이 등장했다.

 

고유명사는 이해하기 쉽다. 고유명사가 이해하기 쉬운 이유는 직설적이고 직관적이기 때문이며 바로 눈 앞에 보이기 때문이다. 눈에 보이는 모든 사물이 고유 명사이다. 지금 내 앞에 있는 노트북, 모니터, 옆에 핸드폰, 쓰레기통까지 고유 명사이다. 말 그대로 세상에 유일한 존재를 고유명사라고 부른다. 일단 세상에 나왔다 하면 사람이든 물건이든 유일한 존재이기 때문에 세상에 존재하는 모든 것들은 고유명사 일 수 밖에 없다. 고유명사는 세상에 존재하는 사물이다.

 

일반명사는 사람이 만들어낸 개념이다. 일반명사는 사람이 만들어낸 개념 안에서만 존재한다. 만약 일반명사가 없다면 등산을 할 때 눈에 보이는 나무를 보고 손가락을 가리키며 저 나무는~ 또 저 나무는~ 저 꽃은~ 하고 말하는 수고를 해야 한다.

 

일반 명사는 공통점을 가진 사물을 공통적으로 부를 수 있는 단어로 정의한 것이다. 박지성, 이영표, 박주영, 이청용을 '축구선수' 라고 부르거나 더 추상화하여 그냥 '사람' 이라고 정의한 것이다. 일반명사 덕분에 사람은 사고하기 간편해졌고 말하기 간편해졌다. 마치 숫자의 발명으로 계산이 편리해진것과 비슷하다. 사실은 숫자보다 일반명사가 더 원초적고 본능적인 인간의 사고능력일 것이다.

 

 

세상의 모든 명사를 고유명사와 일반명사로 나눈 것처럼, 객체지향에서는 객체와 클래스로 나눈다. 명사와 객체지향 개념을 1:1 대입하면 객체는 고유명사이다. 반대로 클래스는 일반명사이다. 일반명사는 저 사람~ 저 물건~ 처럼 유일한 사물을 가르키는 단어가 아니다. 사람, 나라, 자동차, 컴퓨터처럼 사물을 공통적으로 부를 수 있는 단어로 묶은 것이다, 예를 들어 맥북, 센스, X노트 등으로 불리는 고유명사인 사물은 노트북이란 일반명사로 묶어서 부른다.

 

노트북, 휴대폰, 자동차처럼~ 우리가 부르는 일반명사는 명확하게 어느 사물을 가리켜 부르는 것이 아니고 뭉뚱그려 부르기 때문에 그 실체가 애매모호하다. 계속 설명했듯이 일반명사는 명확하게 가리키며 부를 수 있는 눈앞에 존재하는 사물이 아니며 우리 인간의 사고과정을 통해 한단계 추상화시킨 존재이다.

 

클래스는 아직 사람 머릿속에 존재하는 개념이고 아직 세상에 나온 사물은 아니다. 객체지향에서는 클래스처럼 머릿속에 존재하는 개념을 디지털 세상에 탄생하기 위한 작업이 필요하다. 디지털 세상에 탄생하기 위한 작업을 객체지향 언어 자바에서는 클래스를 바탕으로 객체를 생성한다라고 예기한다. 자바에서 우리가 객체를 선언할때

 

    Notebook macbook = new Notebook();

 

이라고 선언한다. 저 소스 한줄을 그대로 해석하면, Notebook 클래스를 macbook이라고 이름지어 객체로 탄생시킨다. 라고 풀어쓸 수 있다. 여기서 Notebook은 아직 세상에 나온 객체가 아닌 일반명사로 존재하는 클래스이고 new Notebook()을 통해 macbook 이라고 이름지은 객체로 생성되었을 때, 비로소 macbook이라는 유일한 고유명사 객체로 활약한다.

 

객체와 클래스의 본질적인 차이를 생각하다보니 생각하지 못한점이 발견됐다.

 

 

위의 그림은 전형적인 상속 구성도 이다. 예전에 종종 위와 같은 클래스 다이어그램을 그려놓고 객체지향 설계에 대해 생각한 적이 있다. 그런데 위와 같은 클래스 다이어그램을 보고 나는 잠시 햇갈린적이 있다.

 

휴대폰이 추상적인 개념인 클래스이고 겔럭시, 아이폰, 넥서스는 좀더 구체적인 고유명사 객체라고 생각했다. 그런데 저 그림은 객체 선언할때 변수명으로 선언해야할 고유명사 겔럭시, 아이폰, 넥서스 등도 객체가 아닌 클래스로 정의한것이 되어버렸다.

 

그러나 좀더 생각해보니 무엇을 잘 못 생각했는지 알 수 있었다. 겔럭시, 아이폰, 넥서스는 휴대폰중 유일한 대상을 지칭한 고유명사인것처럼 보이지만 사실은 겔럭시등도 휴대폰으로부터 좀더 구체화된 일반명사였다는 것이다.

 

    Handphone iphone1 = new Iphone();

 

위의 코드 예처럼 진정한 고유명사는 iphone1 이라는 이름을 가진 객체이다. 클래스로부터 객체가 생성되면 객체는 그때서야 세상에서 유일한 하나의 존재가 된다.

 

 

내가 지금까지 살면서 가장 배고프고 미래에 대한 불안감이 있을때가I T개발자가 되기 위해 학원 교육을 받았을 때였다. 돈은 없고 배고프지만 내가 좋아하는 일을 할 수 있다는 생각에 열심히 하던 때였다.

 

학원 교육이 끝나고 집에갈 때 돈이 없어 학원 동기 들과 짬뽕 국물에 소주 먹을때가 기억난다. 또는 학원 근처에 붕어빵 노점상이 있었다. 우리는 자주 사다리를 타서 붕어빵을 사 먹기도 했다.

 

위의 그림은 붕어빵 종종 먹던 학원 다닐 때 그린 그림이다. 당시 자바를 배우며 가장 어려웠던 내용이 두가지가 있었다. 하나는 자바 머추얼 머신이 어떻게 돌아가는 것인가 이고, 하나는 클래스니 객체니 하는 개념이 도무지 이해가 안되었다.

 

학원 동기들하고 나는 이 두가지 장벽 앞에 좌절했다. 결국 이 개념을 이해 못한 학원동기들이 대부분이었던 것으로 기억한다. 나도 당시 이 개념들을 완전히 이해하지 못하고 넘어갔다. 그래도 저 그림은 당시 어떻게든 객체지향과 자바 머추얼 머신을 이해해보겠다며 삽질한 산물이다.

 

저 그림에서 자바 버추얼 머신의 메모리 영역, 스택 영역은 이 책의 관심사가 아니므로 무시해도 좋을 것 같다. 붕어빵 클래스가 어떻게 유일한 객체로 탄생되는지 그림을 보면 쉽게 이해될 것이다. 클래스는 마치 붕어빵 틀처럼 태어날 사물의 특징을 틀로 만들어 놓았다. 이 붕어빵 틀에서 자바 버추얼 머신이든 뭐든 객체로 탄생시키게 되면 그것이 실제 사람의 입에 들어가는 맛있는 붕어빵이 된다.

 

그래서 "클래스는 일반명사이고 태어날 사물의 틀이며, 객체는 고유명사이고 실제로 태어난 사물이다. 클래스(Class)는 우리 인간의 사고과정을 통해 한단계 추상화시킨 일반명사이고, 객체(Object)는 세상에 유일하게 존재하는 모든 고유명사이다."

 

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