반응형
현재 필자는 자바지기 박재성님이 운영하시는 NextStep 교육 웹사이트에서 수강한 자바 플레이 그라운드 with TDD, 클린코드
마지막 블랙잭 미션을 진행하고 있다. 미션을 해결하기 위해 도메인을 설계하고 있는데, 생각보다 많이 어렵다.
특히 인스턴스 변수 2개까지만 사용하라는 요구사항이 너무 어렵게 느껴져, 객체지향에 관한 보충 공부가 필요하다고 느껴졌다.
그래서 몇 달 전에 읽은 객체지향의 사실과 오해(줄여서 객사오라고 부르겠다)를 다시 읽었다.
이번 포스팅은 객사오 1장부터 4장까지 다시 읽으면서 기억하고 싶은 중요한 부분을 남기려고 한다.
그럼 바로 시작하겠다.
1장. 협력하는 객체들의 공동체
- 객체지향은 현실 세계를 모방하는 것이 아니다. 새로운 세계를 창조하는 것이다.
- 여러 객체가 동일한 역할을 수행할 수 있다. 역할은 대체 가능성을 의미한다.
- 책임을 수행하는 방법은 자율적으로 선택할 수 있다. (캡슐화)
- 한 사람이 동시에 여러 역할을 수행할 수 있다.
- 객체는 상태와 행위를 함께 지니며 스스로 자기 자신을 책임진다.
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다.
각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다. - 클래스가 아닌 객체를 지향하자.
2장. 이상한 나라의 객체
- 객체의 행위(행동)은 상태에 영향을 받고, 객체의 상태를 변경시키는 것은 객체의 행위이다.
- 두 객체의 프로퍼티 값이 같으면 동등성이 보장된다. (쉽게 말해 인스턴스 변수 값이 같은 경우)
- 두 객체의 식별자가 동일하면 동일성이 보장된다. (쉽게 말해 같은 참조 변수의 주소가 같은 경우)
- 상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다.
- 객체지향 설계는 애플리케이션에 필요한 협력을 생각하고 협력에 참여하는 데 필요한 행동을 생각한 후 행동을 수행할 객체를 선택하는 방식으로 수행해야 한다.
- 먼저 객체의 행동을 결정하고 그 후에 행동에 적절한 상태를 선택하게 된다.
- 현실 세계에서 수동적인 사물은, 객체지향에서는 능동적인 객체가 된다.
예를 들어 현실의 음료는 누가 마셔야 음료 양이 감소되지만, 객체지향에서는 누가 음료를 마신다는 메세지를 보내면 음료가 행위를 통해 자신의 음료 양을 감소시킨다.
3장. 타입과 추상화
- 복잡성을 다루기 위해 추상화는 아래와 같은 두 차원에서 이루어진다.
- 첫 번째 차원은 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것이다.
- 두 번째 차원은 중요한 부분을 강조하기 위해 불 필요한 세부 사항을 제거함으로써 단순하게 만드는 것이다.
이전에 NextStep 3번째 미션을 수행하면서 비슷한 메세지를 본 적이 있다. 알아보기 쉽게 책임과 역할을 강조!! - 다형성은 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 뜻한다.
- 객체의 타입을 결정하는 것은 객체의 행동뿐이다.
객체가 어떤 데이터를 보유하고 있는지는 타입을 결정하는 데 아무런 영향도 미치지 않는다. - 타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법이다.
4장. 역할, 책임, 협력
- 객체의 세계에서 협력이라는 문맥이 객체의 행동 방식을 결정한다.
- 객체의 책임은 크게 두 가지 범주로 분류할 수 있다.
- 하는 것:
객체를 생성하거나 계산을 하는 등의 스스로 하는 것, 다른 객체의 행동을 시작시키는 것, 다른 객체의 활동을 제어하고 조절하는 것. - 아는 것:
개인적인 정보에 관해 아는 것, 관련된 객체에 관해 아는 것, 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것. - 역할의 가장 큰 가치는 하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 함으로써 협력을 추상화할 수 있다는 것이다.
- 역할은 다른 객체에 의한 대체 가능함을 의미한다.
- 클래스 간의 관계를 표현하고자 하지 말고, 객체가 협력 안에서 어떡 책임과 역할을 수행할 것인지를 결정해라.
- 객체는 데이터를 저장하기 위해 존재하는 것이 아니라 행위를 수행하며 협력에 참여하기 위해 존재한다.
- 상태와 행위에 대해 고민하기 전에 그 객체가 참여할 문맥인 협력을 정의해라.
이렇게 1장부터 4장까지 중요하다고 생각하는 부분을 적어보았다.
확실히 처음 읽을 때는 안 와닿는 부분이 있었는데, 이번에 여러 경험을 하고나서 책을 읽으니 훨씬 더 잘 와닿았다.
읽으면서 조금은 성장한 것 같아서 뿌듯함을 느꼈다.
일단 이 내용을 기억하면서 블랙잭 미션에 다시 도전하려고 한다. 파이팅..!!
참고 문헌
객체지향의 사실과 오해 (저자: 조영호)
반응형
댓글