클래스를 결정하고 클래스의 속성과 메서드를 고민하는 것이 아닌 객체에 초점을 맞추어라
이 것을 위해 두가지에 집중해야함
1. 어떤 클래스가 필요한지 고민하기 전, 어떤 객체들이 필요한지 고민하라
클래스: 공통적인 상태와 행동을 공유하는 객체들을 추상화한 것
따라서 클래스의 윤곽을 잡기 위해 어떤 객체들이 어떤 상태와 행동을 갖는지 먼저 결정해야 함
"객체를 중심에 두는 접근 방식은 설계를 단순하고 깔끔하게 만듦"
2. 객체를 독립적인 존재가 아니라 기능 구현을 위해 협력하는 공동체의 일원으로 봐라
각 객체는 다른 객체에게 도움을 주거나 의존하면서 살아가는 협력적인 존재임 -> 설계를 유연하고 확장 가능하도록 만듦
객체들의 윤곽이 잡히면 공통된 특성과 상태를 가진 객체들을 타입으로 분류하고 이 타입을 기반으로 클래스를 구현해라.
도메인(domain)?
문제 해결을 위해 사용자가 프로그램을 사용하는 분야를 도메인이라고 함
객체지향 패러다임이 강력한 이유?
요구사항을 분석하는 초기 단계부터 프로그램을 구현하는 마지막 단계까지 객체라는 동일한 추상화 기법을 사용할 수 있기 때문
요구사항과 프로그램을 객체라는 동일한 관점에서 바라볼 수 있기 때문에 도메인을 구성하는 개념들이 프로그램의 객체와 클래스로 매끄럽게 연결 가능
클래스의 내부와 외부를 구분해야 하는 이유?
경계의 명확성이 객체의 자율성을 보장하기 때문이며, 더 중요한 이유로 개발자에게 구현의 자유를 제공함
객체지향은 객체 안에 데이터와 기능을 한 덩어리로 묶어 문제 영역의 아이디어를 적절하게 표현할 수 있게 했으며 이처럼 데이터와 기능을 객체 내부로 함께 묶는 것을 캡슐화라고 함
접근 제어
객체 내부에 대한 접근을 통제하는 이유: 객체를 자율적인 존재로 만들기 위해서
객체가 자율적으로 존재하기 위해서 외부의 간섭을 최소화해야 함
외부에서는 객체가 어떤 상태인지 어떤 생각을 하는지 알아서는 안되며 결정에 직접적으로 개입하려고 해서도 안됨
캡슐화와 접근 제어는 객체를 두 부분으로 나눔
일반적으로 객체 상태는 숨기고 행동만 외부에 공개해야 함
private, protected: 구현, public: 퍼블릭 인터페이스
개발자의 역할을 클래스 작성자와 클라이언트 개발자로 구분하는 것이 유용함
구현 은닉
클라이언트 개발자는 내부 구현을 알 필요없이 인터페이스만 알고 있어도 클래스를 사용할 수 있음
클래스 작성자는 인터페이스를 바꾸지 않는 한 외부에 미치지 않는 영향을 걱정하지 않고도 내부 구현을 변경할 수 있음(즉, public 영역을 변경하지 않는다면 코드를 자유롭게 수정할 수 있음)
따라서 클래스를 개발할 때마다 인터페이스와 구현을 깔끔하게 분리하기 위해 노력해야 함