1. 객체지향과 실세계
객체지향
객체지향 프로그래밍이란 현실 속 사물을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업이다. 그 결과물인 객체지향 소프트웨어는 실세계의 투영이며 객체란 실세계에 대한 추상화이다.
객체지향의 목표는 실게계 모방이 아닌 또다른 세계를 '창조'하는 것이다. 따라서 개발자의 역할은 단순히 실세계를 소프트웨어로 옮겨담는 것이 아닌 사용자들을 만족시킬 수 있는 신세계를 창조하는 것이다.
하지만 우리가 살아가고 감각하는 곳이 실세계인 만큼 객체지향을 이해하고 학습하는데에 실세계의 모방은 효과적이다. ( 비유를 통해 학습하는것이라고 생각됨)
2. 객체지향의 주요 개념 : 역할, 책임, 협력
이 역시도 실세계에 비유할 수 있다. 사회생활에서 사람들은 각자의 역할과 책임을 바탕으로 협력하며 할 일을 처리한다.
협력
-협력의 핵심은 특정한 책임을 수행하는 역할간 연쇄적 요청과 응답을 통한 목표달성이다
-사용자가 최종적으로 인식하게되는 시스템의 기능은 객체들의 협력의 결실이다
책임
-애플리케이션의 기능은 작은 책임들로 분할되고 책임은 적절한 역할수행이 가능한 객체에 의해 수행된다.
- 적절한 객체에게 적절한 책임을 할당하는 것에서 객체지향 설계는 시작된다
역할
-역할은 관련성 높은 책임들의 집합이다.
-여러 객체가 동일한 역할을 수행할 수 있다
-역할은 대체가능성이기도 하다
-각 객체는 책임 수행 방법을 자율적으로 선택할 수 있다.
-하나의 객체가 동시에 여러 역할을 수행할 수 있다.
3. 협력 공동체
객체들이 모여 협력 공동체를 이루는데 이때 객체가 갖춰야 하는 덕목이 있다
1). 객체는 충분히 협력적이어야 한다. 외부의 도움을 무시하고 모든 것을 스스로 처리하려는 전지전능한 객체는 내부적인 복잡도에 의해 자멸한다. 이때 협력적이라는 말은 다른 객체의 명령에 따라 행동하는 수동성이 아니라 요청에 응답하는 것일 뿐이다.
2) 객체는 충분히 자율적이어야 한다. 객체 공동체에 속한 객체들은 공동의 목표를 달성하기 위해 협력에 참여하지만 스스로 결정과 판단에 따라 행동하는 자율적 존재이다.
객체가 자율적인 존재로 남기 위해 필요한 행동과 상태를 지니고 있어야 자율성이 만족되며 이는 내부와 외부를 명확하게 구분하는 것으로 부터 비롯된다.
4. 메시지
객체지향 세계에서 유일한 의사소통 수단은 메시지이다.
객체는 협력을 위해 다른 객체에게 메시지를 전송하고 다른 객체로부터 메시지를 수신한다.
무언가를 요청하고 요청받는 것이 메시지 송수신이다.
5. 매서드
매서드는 객체가 수신된 메시지를 처리하는 방법이다.
외부의 요청이 무엇인지를 표현하는 메시지와 요청 처리를 위한 구체적인 방법인 매서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이다 (추후 캡슐화와도 연관)
메시지와 매서드 분리.!
6. 객체지향의 본질
객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법
자율적 객체란 상태와 행위를 동시에 지니며 스스로 자기 자신을 책임지는 객체
객체는 시스템 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 정해진 역할을 수행한다
객체는 다른 객체와의 협력을 위해 메시지를 전송하고 메시지를 수신한 객체는 메시지를 처리하는 적합한 매서드를 자율적으로 선택한다.
Q. 매서드는 프로그래머가 지정해 주는 것 아닌가? 어떻게 자율적 선택이 가능할까?
-여러 파라미터중 메소드가 처리해줄 수 있는것을 능동적으로 처리한다. 참조는 프로그래머가 지정하지만 작동 자체는 객체가 조건에 따라서 능동적으로 작동한다.
7. 클래스
클래스는 객체들의 협력관계를 코드로 옮기는 도구이다. 객체지향 자체에서는 핵심 개념이 아니다.
Q. 코드로 옮기기 이전의 객체지향은 프로그램 내부에서의 객체지향은 무슨 차이가 있을까?
- 차차 알아가 보자.