제목은 내가 자신에게 던진 질문이다. 내가 지금 작성하고 있는 자바를 처음 배웠을때의 설명은 단순 명료했다.
객체지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임이다.
어느 포털사이트에서 검색을 해봐도 어순은 다르더라도 항상듣는 말인데 결국 객체지향 프로그래밍이란 현실에 존재하는 사무을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업이라는 것을 의미하며 이는 현실을 추상화 한다는 것을 의미한다.
그렇지만 막상 특정한 애플리케이션을 개발하면서는 현실에서 대응이되는 사물을 발견하기란 참 어렵고 개념적인 측면을 실세계의 부분과 모방한다는 설명은 납득이 조금 어렵다. 일을 하게되면 그냥 하라는 대로 하면 되겠지만 그렇게 되었을때 내가 누군가에게 설명을 해주게되면 그게 올바른 설명인것인가 의구심이든다.
여러가지 책들중 '객체지향의 사실과 오해' 라는 책을 읽었는데 이 책에서 나온 내용으로
사실 객체지향의 목표는 실세계를 모방하는 것이아니라 새로운 세계를 창조하는 것이라고 표현했다.
또한 Eiffle 프로그램언어의 설계자이자 OCP(개방폐쇄원칙)을 제안한 버트란마이어(Betrand Meyer)는 "소프트웨어 시스템이 해결하려고 하는 실재는 잘해봐야 먼 친척밖에는 되지 않는다" 말을 했다.
위 두가지 말로서 소프트웨어의 세계와 실세계의 거리에 대한 거리를 이해할 수 있게 설명해놓았다.
" 실세계모방 " 이 단어가 현실적이지 못하더라도 현재까지 객체의 설명이 이렇게 설명되어왔던것은 이해를 돕기위해서 내려오는 과거의 유산이지않을까 생각이 든다.
또한 이 책의 저자는 프로그램을 설계하고 구현하는 실무적인 관점에서는 위와같은 설명들은 부적합 함에도 객체지향을 설명하는 많은 책과 문서들이 실세계의 모방이라는 개념을 포기하지 못하는 이유가 이해력향상임을 말해주고있다.
객체 공동체 속에 살고있는 하나의 객체 시민은 자신에게 주어진 역할과 책임을 다하고 동시에 시스템의 더 큰 목적을 이루기 위해 다른 객체와 협력한다.
지금 말한 것들은 현실에서 사람들이 살고있는 세상처럼 보이는데 이런 형태로 우리는 객체지향에 관한 이해를 높이면된다. 또다른 큰특징들의 예 에서 좋은 부분들을 정리해본다면
- 객체들은 각자의 역할, 책임, 협력을 함으로서 동작한다고 생각하면 이해하기가 편하다.
- 애플리케이션을 개발할때에 기능을 작은 책임으로 분할 시키고 책임은 적절한 역할을 할 수있는 객체에 의해 수행된다.
- 객체는 다른객체에게 도움을 요청하기도하고 각자의 역할과 책임을 수행하는 객체로서 분리되고 서로간의 요청과 응담으로 구성된 협력을 한다.
- 책임이 불분명한 객체는 애플리케이션의 미래를 불분명하게 만든다
위와같은 이야기로 풀었을때는 정말 하나의 객체는 한명의 사람과 같은 현실을 모방하였다 라는 말을 사용하는 이유를 이해할 수 있었다.
위에 내용들에서 말하는 객체에대한 부분이 머리속으로 명확히 그려지지 않아 한번더 살펴 보게되었는데 찾아본 바로는 아래와 같다.
객체란 상태(State)와 행동(Behavior)을 함께 지니고 있는 실체를 말한다.
- 객체는 자율성을 가져서 내부와 외부를 명확하게 구분하여야한다.
- 또한 객체의 사적인 부분은 객체 스스로관리를 하면서 외부에서는 접근이 허락된 수단만으로 의사소통을 해야한다.
- 데이터와 프로세스를 객체라는 하나의 틀안에 묶음으로서 자율성이 보장된다면 객체로 구성된 공동체는 유지보수가 쉽고 재사용이 용이한 시스템으로 구축될수 있다.
책을 읽고 공부한 객체지향은 추상적인 부분이 많아서 내 마음대로 해석이 된 부분이 너무 많은것같다. 그래서 위의 내용은 부정확한 부분들이 많을 수 있고 아래의 내용은 책에서 직접적으로 말한 객체지향의 본질에 대한 내용을 그대로 들고와보았다.
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
- 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
- 객체는 시스템의 행위를 구현하기위해 다른 객체와 협력한다. 각 객체는 협력내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
- 객체는 다른 객체와 협력하기위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택한다.
- 객체는 다른객체가 '무엇(What)'을 수행하는지는 알 수 있지만 '어떻게(How)'수행하는지는 알수 없어야한다.
책을읽고 생각나는것들만 어영부영 정리한 느낌이라서 나중에 보았을때 얼굴이 빨개질것 같지만 책을 읽고 한번 생각을 정리하는 느낌으로 적었기 때문에 만약 정말 세부적인 것이 궁금하다면
조영호씨의 객체지향의 사실과 오해 라는책을 한번 사서 읽어보면 좋을것같다 부록을 제외하면 200page정도 밖에 안되는 분량이라 가볍게 도전하기 좋았다.
'좋은 개발자가 되기위한 방법들 > 객체지향' 카테고리의 다른 글
객체지향 4대특성 (다형성) 쉽게정리 (0) | 2021.09.29 |
---|---|
객체지향 4대특성(캡슐화) (5) | 2021.09.24 |
객체지향의 중심인 클래스란? (0) | 2021.09.15 |
객체지향 4대 특성 (추상화) (0) | 2021.09.13 |
Clean코드 작성하는 3가지 원칙(코드 잘짜는법) (2) | 2021.07.07 |