협력, 객체, 클래스
객체 지향 프로그래밍의 지향점
- 객체 지향은 객체를 지향하는 것이며 클래스를 지향하는 것이 아니다. 진정한 객체지향 패러다임은 객체에 집중했을 때 얻을 수 있다. 이를 위해 두가지에 집중해야 한다.
- 첫째, 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민해라.
- 클래스는 객체를 추상화한 것이다, 어떤 상태와 행동을 가지는지 먼저 결정해야 한다.
- 둘째, 둘째, 객체는 독립적인 존재가 아니라 협력에 참여하는 일원이다.
- 객체는 홀로 프로그램을 구성하는 것이 아니다. 협력 관계 속에 놓여진 존재다.
도메인
- 도메인이란? 문제를 해결하기 위해 사용자가 프로그램을 사용하는 분야다.
- 클래스 기반의 객체 지향 언어에 익숙하면 도메인 개념들을 구현하기 위해 클래스를 사용한다. 이를 통해 도메인 구조와 클래스의 구조는 유사해진다.
도메인 구조 기반으로 클래스 구현하기
public class Screening {
**private** Movie movie;
private int sequence;
private LocalDateTime whenScreened;
**public** Screening(Movie movie, int sequence, LocalDateTime whenScreened) {
this.movie = movie;
this.sequence = sequence;
this.whenScreened = whenScreened;
}
public LocalDateTime getStartTime() {
return whenScreened;
}
public boolean isSequence(int sequence){
return this.sequence == sequence;
}
public Money getMovieFee() {
return movie.getFee();
}
}
- 클래스를 구현하거나 개발된 클래스를 사용할 때 가장 중요한 것은 클래스의 경계를 구분하는 것이다.
- 그렇다면 왜 클래스의 경계를 구분할까?
- 경계의 명확성이 객체의 자율성을 보장하기 때문이다.
자율적인 객체와 프로그래머의 자유
- 객체 지향은 객체라는 단위에서 데이터와 기능을 캡슐화할 수 있게 되었다.
- 그리고 캡슐화를 하는 것에서 나아가 접근을 통제하는 접근 제어 매커니즘도 접근 수정자를 통해 제공한다.
- 캡슐화와 접근 제어는 객체를 두 부분으로 나눈다. 이를 인터페이스와 구현의 분리 원칙이라고 한다.
- 퍼블릭 인터페이스 : 외부에서 접근 가능한 부분
- 구현 : 내부에서만 접근 가능한 부분
- 접근 제어 매커니즘은 클래스의 내부와 외부를 명확하게 경계 짓고 동시에 클래스 작성자가 내부 구현 은닉할 수 있게 해준다.