티스토리 뷰
OOP, 즉 객체지향이을 논하려면, 말씀하신대로 도대체 "객체지향이란 무엇인가"에 대해서 한 번쯤은 생각을 해 봐야 할 것입니다.
그리고 객체지향이런 무엇인가를 생각하려면 먼저 '객체란 무엇인가'라는 근본적인 물음에 대해서 어느 정도의 가닥을 잡고 있어야 할 필요가 있습니다.
일단 객체지향이라는 것도 알고 보면, 모든 것을 객체 위주로 생각하는 것이기 때문에, 객체가 무엇이며 그것이 어떤 성질을 가지고 있는지,
또 객체는 어떻게 다루면 되는 것인지에 대한 것을 실제로 부딪히면서 채득하는 것이 좀 더 쉬운 접근방법이라고 생각됩니다.
자전거를 배우려면 직접 타봐야 하듯이 말입니다.
이제 그러한 마음가짐으로 이제부터는 객체가 무엇인지부터 하나씩 짚어보도록 하겠습니다.
'객체 지향 프로그래밍'이 컴퓨터에서 이루어진다고 해서, '객체'라는 개념 자체가 컴퓨터에만 한정되어 있는 것은 결코 아닙니다.
오히려 객체는 평범한 우리의 일상 생활에서 그 개념을 잡아야 합니다.
왜냐하면 객체지향이라는 생각 자체가 우리가 살고 있는 세상에서 일어나는 문제를 컴퓨터로 해결하기 위해서 대두되었기 때문입니다.
여러분은 지금 제가 쓴 글을 보고 있습니다. 무엇을 통해 보고 계십니까? 대부분 모니터를 통해 보실 것입니다.
가끔씩 이 글의 다음 쪽을 보기 위해서 여러분은 무엇을 합니까? 대부분 글자판이나 마우스를 누를 것입니다.
글쇠판과 마우스는 무슨 일을 할까요? 여러분의 생각을 컴퓨터로 전하는 일을 합니다.
모니터는 어떻습니까? 끊임없이 여러분에게 글과 그림을 뿌려 데고 있습니다. 컴퓨터가 만들어 놓은 결과를 여러분에게 전달하기 위해서일 것입니다.
여러분은 자동판매기를 이용해 본 적이 있습니까? 그럼 자동판매기에서 어떻게 원하는 음료수를 뽑아 내는지를 가만히 기억해 보십시오.
우선 동전을 필요한 만큼 넣습니다.
그런 다음 원하는 음료수(저는 '커피')의 이름이 적힌 단추를 누릅니다.
그러면? 음료수('커피'?)가 나옵니다.
여러분은 문을 열고 음료수를 꺼낸 다음 마시면 됩니다.
여러분은 개를 기르고 있습니까? 개의 종(種)은 무엇입니까? 털 색깔은 어떻지요? 몸무게는 어떻게 될까요? 뭐, 제가 이런 것들을 알 필요는 없겠지만, 여하튼 개는 개 나름으로의 특성을 가지고 있습니다. 같은 개라 하더라도...
여러분이 길다란 막대기 하나를 던져 주고 "주워 와!"하면 개는 그 지시를 받아서 행동합니다. 개가 똑똑하면 여러분의 지시를 제대로 수행할 것이고, 그렇지 않으면 엉뚱한 일을 수행할 것입니다. 훈련하기에 달린 거죠. :)
아프면 여러분은 병원에 갑니다. 병원에 가서 여러분은 의사에게 병을 고쳐 줄 것을 부탁합니다. 그러면 의사는 여러분의 상태를 파악하고 진찰한 후 적절한 처방을 써서 여러분의 병을 고쳐 줍니다.
여러분이 병원에 갈 때 '인체 해부학'이나 '생리학'과 같은 의학을 알 필요가 있었습니까? 그저 여러분은 의사에게 가서 진찰을 부탁했을 뿐입니다. 그것으로 족합니다.
여러분이 만일 의사가 되고 싶으면 의학 공부를 하면 됩니다. 허나 모든 사람이 아플 때마다 의사가 될 수는 없지않겠습니까? 내가 필요하면 병원에 가서 의사에게 진찰을 부탁하면 되는 것입니다.
객체(object)를 가장 간단한 낱말로 표현한다면 '물건'이 될 것입니다. 넓은 의미에서 살아 있는 생물도 물건에 속합니다. 생물(生物)을 한자로 풀어쓰면 "살아 있는 물건"이란 뜻을 가지고 있습니다.
지금까지 제가 앞에서 예로 든 모든 것이 객체입니다.
모니터, 글쇠판, 마우스, 자동판매기, 음료수, 동전, 문, 좀 더 생각을 넓혀서 살아 있는 개, 심지어는 '의사'와 같은 사람까지도, 이 모든 것이 '객체'입니다.
물건은 어느 하나 쓸모가 없는 곳이 없습니다. 모든 것은 자기 나름의 역할을 가지고 존재합니다. 심지어 필요 없다고 생각되는 쓰레기들도 모두 자신의 소명을 다하고 있습니다.
다시 말하면, 모든 객체는 자신의 역할을 가지고 있다고 볼 수 있습니다.
객체가 자신의 역할을 충실히 수행함으로써 세상이 제대로 돌아가고 있는 것입니다.
이 세상은 참으로 많은 객체로 가득 차있는데, 각각의 객체들이 저마다 자신의 역할을 충실히 수행해 나간다고 생각해 봅시다.
일사불란하게 움직이는 자연을 보면, 경이롭기까지 합니다.
요컨대, 객체는 저마다의 역할을 가지고 있습니다.
객체가 어떤 역할을 수행하기 위해서는, 누군가가 그 객체에게 무언가의 __지시를 내려 주어야__ 합니다.
글쇠판이 컴퓨터에게 정보를 입력하기 위해서는 누군가가 글쇠판을 __눌러 주어야__ 합니다.
즉 손으로 글쇠판에게 "누른다"라는 지시를 내리는 것입니다.
모니터는 컴퓨터의 중앙처리장치(CPU)의 지시를 받아 움직이는 그림판(graphic card)의 지시로 화면에 여러 가지 정보를 뿌립니다.
자동판매기는 말할 것도 없습니다. 우리가 동전을 넣고 음료수를 마시겠다고 지시하는 것입니다. 그 결과 자동판매기는 음료수를 내놓는 것이지요.
개는 우리의 말을 어느 정도는 알아듣습니다.
우리의 말을 알아들을 수 없는 객체에게 우리는 물리력(物理力)으로 지시를 내립니다.
그러나 말을 알아들을 수 있는 객체에게, 우리는 '언어'를 통해 지시를 내립니다.
병원의 의사는 말할 것도 없습니다. 같은 사람의 입장에서 '지시를 내린다'는 표현을 쓰기가 좋지 않으므로, '치료를 부탁한다'라고 말만 바꾼 것뿐이지
실재로는 우리가 '의사'라는 __객체에게__ "치료해 달라"고 지시하는 것과 다를 바가 없습니다.
이와 같이 모든 객체는 지시에 의해 움직입니다. 다시 말하면, 우리가 어떤 객체를 사용하기 위해서는, 반드시 그 객체에게 지시를 내려 주어야만 한다는 것입니다.
객체는 지시를 받음으로써 어떤 일을 합니다.
객체에는 저마다의 특성이 있습니다. 개의 특성은 "다리가 네 개, 눈이 두 개, 입은 하나..." 등과 같이 열거할 수 있고, 마우스의 특성은 "손에 꼭 맞도록 설계되어 있고, 두 개 또는 세 개의 단추가 있다"쯤으로 말할 수 있을 것입니다.
객체의 역할은 그 객체가 가지고 있는 특성에 따라 좌우됩니다. '개'와 '의사'는 같은 생물이라 하더라도 가지고 있는 특성이 서로 다르기 때문에 자기들만의 역할이 있는 것입니다.
만일 의사와 개가 완전히 똑같은 특성을 가지고 있다면, 우리는 개에게 병을 치료하라고 지시할 수 있을 것인데, 두 객체의 특성이 다르기 때문에 감히 개에게 "병 고쳐 달라"는 사람이 없지 않습니까? :)
따라서 모든 객체는 자신들만의 특성이 있고, 이 특성이 결국 객체의 역할을
규정지어 줍니다.
그런데 여러 개의 객체를 다루다 보면 사로 비슷한 특성을 가진 객체들을 발견할 수 있습니다.
예를 들어 '글자판'과 '마우스'는 "우리의 생각을 컴퓨터에게 입력시킬 수 있는 특성"을 가지고 있습니다. 또한 '진돗개'나 '푸들'은 서로 다른 특성을 가지고 있는 객체이지만, '개'만이 가지고 있는 공통적인 특성을 가지고 있습니다.
이와 같이 서로 비슷한 특성을 가지고 있는 객체들은 따로 묶어서 클래스(class)를 지을 수 있습니다. '클래스를 짓는다'는 말은 종류별로 나눌 수 있다는 말입니다.
'마우스'와 '글자판'은 "입력 장치"라는 클래스로, '진돗개'와 '푸들'은 "개"라는 클래스로, 다시 '개'와 '사람'은 "생물"로 클래스를 지을 수 있습니다.
그리고 '입력 장치', '개', '사람', '생물'은 모두 '물건' 이라는 클래스에 속하게 됩니다.
요컨대, 모든 객체는 저마다 자신이 속해 있는 클래스(class)가 있습니다.
좀 지루했습니까? 하지만 위의 글들이 흔히 말하는 '객체'의 특성을 대부분 설명해 주고 있습니다.
객체가 가지고 있는 몇 가지 성질들을 정리해 두겠습니다.
모두 지금까지 읽으신 글과 연결되어 있으니 곰곰이 생각해 보시기 바랍니다.
- 객체는 저마다 맡은 역할(roll)이 있다.
- 객체는 지시(message)를 받음으로써 자신의 역할을 수행한다.
- 객체는 나름으로의 특성을 가지고 있다.
→ 이 특성이 객체의 역할을 규정짓는다.
- 비슷한 특성을 가진 객체들을 모아 '클래스'를 지을 수 있다.
→ 모든 객체는 저마다 자신이 속한 클래스가 있다.
지금까지 살펴본 것이 바로 객체입니다.
프로그램을 작성할 때 이런 객체를 염두해 두고 작성하는 것이 바로 객체지향(object-oriented)입니다.
객체들의 특성을 프로그래밍 언어에서 구현하기 위해서는
- 정보 은폐(encapsulation): 밖에서 객체 내부를 볼 수 없도록 막아 놓습니다. TV를 열어놓고 반도체 소자를 건드려서 채널을 바꾸는 사람이 없겠죠? ^^ 최소한의 동작이 가능하도록 버튼을 만들어 놓습니다. 이게 정보 은폐입니다.
- 다형성(polymorphism): 같은 메시지라도 그 메시지를 받는 객체가 다르면 서로 다르게 행동하는 겁니다. 이를테면 "돈을 쓰다"와 "글을 쓰다"에서, "쓰다"라는 건 같은 메시지이지만, 객체에 따라서 의미가 달라지죠?
- 상속성(inheritance): 앞에서의 객체의 특성 중에, 클래스가 있었습니다. 비슷한 종류의 객체들을 서로 묶어서 클래스로 분류하는데, 이 때 하위 클래스가 상위 클래스의 특성을 물려받는 것입니다. "선생님", "학생"은 모두 "사람"이라는 특성을 물려 받습니다.
- 추상화(abstraction): 복잡한 동작을 추상적으로 설명해 낼 수 있는 특성입니다.
좀 더 자세히 설명하려면 끝이 없겠지요? 결국, 프로그래밍에서 모든 걸 객체로 생각하는 방식, 그리고 프로그램에서 문제를 해결하는데 필요한 객체를 만들어서 조합하는 방식이 바로 객체지향 프로그래밍입니다.