객체지향의 사실과 오해 - Chapter1, Chapter2
이번 주 부터 객체지향에 대한 스터디를 시작했다.
스터디 방식은 각 챕터당 한 사람을 배정하여 그 사람이 발표를 준비하여 스터디원 앞에서 발표하고 토론하는 방식이다.
오늘 첫 스터디를 하고 난 후 정리하고 배운 내용을 정리하려고한다.
Chapter 1. 협력하는 객체들의 공동체
중요 Keyword : 협력, 역할, 책임, 자율성, 캡슐화, 연결완전성
1. 협력
협력이라는 단어는 우리가 알고있는 뜻과 비슷한 내용이다.
객체 간의 요청과 응답을 통하여 다른 객체들과 협력한다라고 지칭한다.
2. 역할
역할이란 어떠한 객체가 맡은 일을 말한다. 예시를 들면 Java코드의 interface가 그 역할을 한다.
인터페이스는 각자의 역할을 배정해주는 역할을 한다.
그리고 새로운 객체를 생성해서 그것을 구체적으로 객체에 맞게 구현하는 것이 책임을 만드는 것이다.
public interface Walkable {
void walk();
}
public interface Flyable {
void fly();
}
3. 책임
책임이란 위에서 말했듯이 역할을 구체화 시킨 것이라고 생각한다.
위의 예시에서 Walkable객체를 만들경우 꼭 walk라는 역할을 수행해야하고 walk를 어떻게 책임지는지 결정해줘야한다.
@Override
public void walk() {
// ...
}
4. 자율성
자율성이란 협력을 구성하는 데에 효율적이다. 객체는 상태와 행동으로 구성된다(2장에서 설명).
이러한 상태를 다른 누군가가 아닌 자기 스스로 결정하고 변경하는 것을 자율성이라고 한다.
난 자율성이 객체를 만드는데 가장 중요한 요소라고 생각한다.
5. 캡슐화
캡슐화는 외부에서 안을 들여다 볼 수 없게 하는 것이다. 협력 안의 객체들은 다른 객체들이 무엇을 하는지는 알 수 있어도 내부의 상태들에 대해서는 알지 못한다. 이것을 캡슐화라고한다.
6.연결완전성(Seamless)
이 단어가 제일 중요한데 제일 이해하기 어려웠다.
"Seamless"는 Seam이 없는 환경을 말한다. 즉 각각의 객체들을 하나의 결과로 묶어 "끊김이 없이" 하나의 서비스로 인식 할 수 있다라는 뜻의 단어로 이해했다.
이렇게 위의 Keyword에 대해서 살펴봤다.
이제 책의 내용을 훑어보자. 솔직히 위의 단어들을 이해했으면 밑의 설명 부분은 읽지 않아도 된다.
위의 그림이 모든 것을 말해주고 있다.
손님(객체1), 캐시어(객체2), 바리스타(객체3)은 각자의 맡은 역할이 있고 그 안에서의 책임을 가지고 서로 협력한다.
그렇게해서 결과적으로 카페의 서비스를 이해 할 수 있다.
여기서 중요한 점은 역할과 책임의 특징이 있다는 것이다.
1. 여러 객체가 동일한 역할을 수행할 수 있다.
2. 역할은 대체 가능성을 의미한다.
3. 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
4. 하나의 객체가 동시에 여러 역할을 수행할 수 있다.
이 4가지 특징은 반드시 지켜져야하고 우리가 객체를 사용해야만 하는 이유이다.
1장의 마지막은 객체는 충분히 "협력적"이며 "자율적"이여야한다!!!!!!!!!!!!!!!!!!!!!
Chapter 2. 이상한 나라의 객체
중요 Keyword : 상태, 행동, 식별자, 프로퍼티
1. 상태
상태는 객체가 가져있는 값이다. 즉 연속적인 행동들을 모두 참조하고 그 결과를 저장해놓은 곳.
그리고 다음 행동을 할 경우 영향을 주게 된다.
2. 행동
상태를 변경하는 요소이다. 이전 상태 + 현재 상태를 종합하여 행동의 결과가 나온다.
그러므로 상태와 행동은 서로 의존적이라고 볼 수 있다.
3. 식별자
집을 예로 들어보자. 우리 집에는 에어컨, 선풍기, 미니 선풍기 등등 다양한 가전제품이 있다.
이것을 우리는 구별 해낼 수 있다. 이러한 것들을 식별 가능하다고 한다.
4. 프로퍼티
객체의 상태를 구성하는 모든 특징들을 통틀어 객체의 프로퍼티라고한다.
크게 동적 프로퍼티(객체 자신의 값)과 정적 프로퍼티(다른 객체를 참조하는 값)으로 구성된다.
이제 Keyword를 알아봤으니 책의 내용을 살펴보겠다.
아래는 앨리스의 이야기이다. 요약본이니 참고하자.
앨리스는 시냇가에서 놀다가 이쁜 정원을 발견했다.
이쁜 정원으로 가기 위해서는 작은 문(40cm)을 통과해야만 했지만 앨리스는 키가 100cm였다.
그러던 와중 주위를 둘러보니 물, 케이크, 버섯 등이 있었다.
이것을 먹었더니 키가 조절이 가능해졌다. 그래서 앨리스는 양을 조절하여 먹으면서 키를 조절하여 정원으로 이동하였다.
이 글에서 앨리스, 물, 케이크, 버섯은 하나의 각자 객체로 이해하면 된다.
그리고 앨리스의 위치 및 키는 객체의 상태를 나타내고 있다.
앨리스가 키가 작아지기 위해서 물을 마시고 버섯을 먹고 케이크를 먹는 것은 행동에 해당된다.
앨리스는 키가 작아지고 위치가 바껴도 앨리스는 앨리스이다라는 건 변함이 없기 때문에 식별이 가능하다.
위의 4가지 문장은 2장에서 설명하는 큰 흐름이다. 그러면 첫 번째로 "상태"에 대해서 알아보자.
- 상태
처음으로 상태를 왜 사용해서 표현할까라는 설명이 나온다.
우린 연속적인 행동들을 모두 참조하고 기억 할 수 없다. 그래서 상태를 만들어 행동이력의 결과로 모든 것을 이해 할 수 있게 만들었다.
이러한 상태는 단순한 값 + 객체의 조합으로 이루어져 있다. 이것을 통틀어서 Property라고 한다.
Property의 예시는 앨리스의 키, 몸무게, 위치 등이 있다. 정적인 요소들로 구성된다.
Property value는 시간의 흐름에 따라 바뀌는 동적인 요소들로 구성된다. 음료의 양, 앨리스의 키(cm), 위치(어딘지)등이 있다.
Property value는 Property의 구체적인 값이라고 생각하면 쉽다.
여기서 링크와 속성이라는 개념이 나온다.
링크는 다른 객체를 식별 할 수 있는 것이다. 그리고 속성(attribute)은 객체를 구성하는 단순한 값을 지칭한다.
- 행동
행동은 상태를 변경시키는 요소이다. 그러면서 상태에 영향을 받는 요소이기도 하다.
행동으로 상호작용을 하는 경우는 자신의 상태 변경 또는 행동 내에 협력하는 다른 객체에 대한 메시지 전송이다.
여기서 상태 캡슐화라는 개념이 나온다. 상태 캡슐화는 객체가 자신의 상태를 감출 수 있게 설계하고 노출하고 싶은 것은 노출하게 설계하라는 뜻이다. 그렇게 해야 객체는 자율적으로 움직일 수 있다.
- 식별자
객체 구분이 가능하게 만든 것이 식별자이다. 식별자를 기준으로 객체는 두 가지로 나눌 수 있다.
단순한 값과 객체(값 객체, 참조 객체)로 나뉠 수 있다.
※ 값
오직 값을 통해서만 인스턴스를 비교하기 때문에 별도의 식별자가 필요없다.
동등성(1==1)만 유지되면 같은 것으로 본다.
※객체
객체는 동일성을 판단하기 때문에 식별자를 기반으로 비교한다.
상태를 기반으로 비교하면 시간에 따라서 변하기 때문에 비교 할 수 없다.
여기서 값과 객체에 대한 개념이 헷갈릴 수 있다. 왜냐면 Integer와 person이라는 두 객체는 똑같이 클래스로 생성되기 때문이다.
그래서 person같은 객체는 참조 객체 또는 엔티티라고 부른다.
그리고 Integer라는 객체는 값 객체라고 부른다.
둘의 차이는 식별자를 가지고 있느냐 없느냐이다.
- 기계와 객체
개발자의 주된 업무 : 객체 상태 조회(query), 객체 상태 변경(command)
기계를 하나의 객채로 보자. 버트란드 마이어는 위의 기계를 객체에 비유한다.
"ㅁ" 버튼을 누르면 객체는 행동하여 상태를 변경시킨다.
"O" 버튼을 누르면 객체의 상태를 조회할 수 있다. 그러면 디스플레이에 상태의 값이 나온다.
기계를 분해하지 않으면 내부의 구조를 들여다 볼 수 없다. 어떤 행동을 하는지 예상은 가능하다.
기계가 행동하고 난 후 조회버튼이 없으면 우리는 행동 후 상태를 조회할 수 없다. 이것이 바로 객체의 캡슐화, 자율성을 나타낸다.
이렇게 Chapter1,2를 요약해봤다.
이 책을 읽으면서 어렵다는 느낌도 살짝 들었다. 3번 정도 반복적으로 읽으니 내용이 정리되었다.
그리고 이것을 여러 사람 앞에서 발표하고 토론을 하니 더욱 더 성장하는 느낌이 든다.
다음 주 Chapter3,4스터디가 기대된다!