오브젝트 조영호님의 책 오브젝트를 보며 정리한 내용입니다. 문제가 될 시 해당글 삭제하겠습니다. 책의 내용이 반복되는 느낌이 있지만, 이름이 가진 설계 원칙을 통해 기법들을 정리하는 것은 장황하게 설명된 내용들을 정리하고, 설계를 논의할 때 사용할 수 있는 공통 어휘를 정의한다는 점에서 의의가 있다. [개방 폐쇄 원칙(Open-Close Principle, OCP)] 객체는 확장에 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다! 확장에 대해서 열려 있다 : 애플리케이션 변경사항이 생겼을 때, 변경에 맞게 새로운 동작을 추가할 수 있다. 수정에 대해 닫혀 있다 : 기존 코드를 수정하지 않고도 애플리케이션 동작을 추가 변경이 가능하다. 추상화가 핵심이다 개방 폐쇄 원칙의 핵심은 추상화에 의존하는 것이..
조영호님의 책 오브젝트를 보며 정리한 내용입니다. 문제가 될 시 해당글 삭제하겠습니다. [의존성 이해하기] 변경과 의존성 실행 시점 : 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 한다. 구현 시점 : 의존 대상 객체가 변경된 경우 의존하는 객체도 함께 변경된다. 의존성은 방향성을 가지며 그 방향성은 항상 단방향이다. 객체가 의존하고 있는 객체가 의존하는 객체는 모두 의존관계이다.(의존성 전이) 직접 의존성 : 코드 안에서 명시적으로 드러나는 경우 간접 의존성 : 코드 안에서 명시적으로 드러나지 않는 경우 런타임 의존성과 컴파일타임 의존성 객체지향 어플리케이션에서 런타임에 주인공은 객체이다. 컴파일 타임에 주인공은 클래스이다. 중요한 것은 런타임 의존성과 컴파..
조영호님의 책 오브젝트를 보며 정리한 내용입니다. 문제가 될 시 해당글 삭제하겠습니다. [프로시저 추상화와 기능 분해] 객체지향 이전의 추상화 기법기법이다. 프로시저 추상화 : 반복적으로 실행되거나 거의 유사하게 실행되는 작업들을 하나의 장소에 모아놓음으로써 로직을 재사용하고, 중복을 방지하는 추상화 기법 -> 프로시저를 추상화라 부르는 이유는, 구현을 모르더라도 인터페이스만 알면 사용할 수 있기 때문이다. ->전통적인 기능분해의 방법이 하향식 설계 방법이다. [하향식 설계(Tree 형식)] 하향식 설계 : 하나의 함수를 더 작은 함수로 분해하고, 분해된 함수들의 실행순서를 결정하는 방법. 하향식 설계의 문제점 하나의 함수에 제어가 집중되기 때문에 확장이 어렵다. 과도하게 함수에 집중하게 함으로써, 소프..
조영호님의 책 오브젝트를 보며 정리한 내용입니다. 문제가 될 시 해당글 삭제하겠습니다. 책임 주도 설계 데이터보다 행동(외부에서 제공하는 행동)을 먼저 결정하라 협력이라는 문맥 안에서 책임을 결정하라 - 책임은 객체의 입장이 아니라 객체가 참여하는 협력에 적합해야 한다. - 협력에 적합한 책임을 수확하기 위해서, 메시지를 결정한 후에 객체를 선택해야 한다. (메시지가 클라이언트의 의도를 표현한다) 책임 할당을 위한 패턴(GRASP?) 도메인 개념에서 출발하기 - 설계를 시작하기 전에 도메인에 대한 대략적인 모습을 그려 보는 것이 유용하다. - 도메인 개념들을 책임 할당의 대상으로 사용하면 코드에 도메인의 모습을 투영하기가 쉬워진다. 정보 전문가에게 책임을 할당하라 질문1 : 메시지를 전송할 객체는 무엇을..
조영호님의 책 오브젝트를 보며 정리한 내용입니다. 문제가 될 시 해당글 삭제하겠습니다. 객체지향의 설계의 핵심은 역할, 책임, 협력이고 그 품질을 결정하는 가장 중요한 요소는 책임이다! 객체의 결합도와 응집도를 합리적인 수준으로 유지할 수 있는 중요한 원칙은 객체의 상태가 아닌, 객체의 행동에 초점을 맞추는 것이다. -> 상태의 초점을 맞추게 되면, 객체의 내부구현을 인터페이스에 노출시키는 결과를 낳게되어 유지 보수에 어려움을 겪는다. [캡슐화](객체지향에서 복잡성을 다루는 추상화의 방법!) 상태와 행동을 하나의 객체 안으로 모으는 형태로, 객체의 내부 구현을 외부에 숨기기 위함이다. 객체를 사용하면 변경 가능성이 높은 부분은 내부에 숨기고 외부에는 상대적으로 안정적인 부분만 공개한다. 객체 내의 상태값..
조영호님의 책 오브젝트를 보며 정리한 내용입니다. 문제가 될 시 해당글 삭제하겠습니다. 객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다. 협력 : 객체들이 애플리케이션 기능을 구현하기 위해 수행하는, 상호작용 책임 : 객체가 협력에 참여하기 위해서 수행하는 행동, 로직? 역할 : 객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행하는 역할이 된다. - 객체는 고립된 존재가 아닌, 시스템의 기능이라는 더 큰 목표를 향해 다른객체와 협력하는 사회적인 존재. - 협력은 객체지향 세계에서 기능을 구현할 수 있는 유일한 방법. -> 메시지 전송(객체가 다른 객체에게 도움을 요청) -> 메시지를 수신한 객체는 메서드를 실행해 요청에 응답한다.(객체가 자신의 일을 스스로 처리할 수 있는 자율적인 존..
조영호님의 책 오브젝트를 보며 정리한 내용입니다. 문제가 될 시 해당글 삭제하겠습니다. 객체지향이란? - 객체를 지향하는 것으로! 그 중심에는 객체가 위치한다. - 객체지향에서 가장 중요한 것은 애플리케이션의 기능을 수행하기 위해 협력에 참여하는 객체들 사이의 상호작용이다. - 객체들은 협력에 참여하기 위해 역할을 부여받고 그에 적합한 책임을 수행한다. 객체지향 프로그래밍 주의사항! 1. 어떤 클래스가 필요한지가 아닌, 어떤 객체가 필요한지 생각해라! -> 설계를 단순하고 깔끔하게 만든다. 2. 객체를 독립적인 존재가 아닌 기능을 구현하기 위해 협력하는 공동체로 바라봐라! 자율적인 객체 1. 객체가 상태와 행동을 함께 가지는 복합적인 존재이다!(캡슐화) 2. 객체가 스스로 판단하고 행동하는 자율적인 존재..
조영호님의 책 오브젝트를 보며 정리한 내용입니다. 문제가 될 시 해당글 삭제하겠습니다. 객체지향에서 문제가 되는 코드 1. 예상을 빗나가는 코드 - 현실세계와 맞지 않는 행동의 메서드를 가지고 있는 경우 ex) 소극장이 표를 사는 고객의 가방에 접근하는 것은 실제와 맞지 않다. 2. 변경에 취약한 코드 - 결합도가 높은 코드의 경우, 변경사항이 발생했을 때, 연관된 많은 클래스를 바꾸어야 한다. - 이는 코드의 유지보수가 취약해 지는 문제가 있다. 객체지향의 목표 1. 객체 사이의 결합도를 낮춰 변경이 용이한 설계를 만들어야 한다. 올바른 객체지향 설계 - 객체 내부의 상태를 캡슐화하고, 객체 간에 오직 메시지를 통해서 상호작용하도록 만드는 것이다! 1. 객체의 자율성을 높이자! - 객체가 스스로 처리할..