소스코드 : https://github.com/JangAJang/the-orient-of-Object-Orientation/tree/main/chapter2
딱 한줄로 2장의 소감을 말하자면, 1장에서 던진 추상적인 질문에 대해서 하나씩 자세한 예시를 들어주는 느낌이었다.
1장은 하나의 큰 화두를 던져준다면,
2장에서는 자세한 썰을 푸는 느낌이다.
(진짜 고급진 단어만으로 글을 쓰고싶지만, 내 블로그는 그런 곳이 아니라고 생각된다 하핳)
일단 앨리스부터는, 조금 더 실제 실행시킬 수 있는 모양새의 프로젝트를 만들어보려고 노력했다.
객체지향 생활 체조?도 해보면서 객체지향적인, 클린한 코드 만들기를 습관화를 하려고 노력을 하는 중이다.
로마는 하루에 안만들어지니까, 일단은 뭐다?
앨리스라는 객체가 있다.
이 객체는 부채를 부치면 키가 조금씩 크고,
버섯은 한 쪽을 먹으면 키가 크고, 다른 쪽을 먹으면 키가 작아진다.
음료는 키를 크게 만들고, 케이크는 키를 작게 만든다.
여기에서 앨리스라는 객체와, 부채, 버섯, 음료, 케이크는 서로 협력하며 움직인다.
앨리스는 해당 객체들과 협력하며 키라는 '상태' 가 바뀌며,
다른 객체들은 앨리스의 키를 크게 해주면서 먹을 수 있는 횟수, 내구도가 바뀌게 된다.
책에서는, 이런 객체간의 협력이 객체의 상태에 변화를 준다고 알려준다.
객체는 항상 그대로 있지만, 결국 객체의 상태가 변한다.
앨리스의 키는 계속 변한다고 한다.
하지만, '앨리스의 키'라는 상태 뿐만 아니라, '버섯의 크기', '케이크의 조각 수', '음료의 양', '부채의 내구도' 또한 바뀔 것이다.
객체라는 것들은 협력하며 하나의 동작을 이루어낼 때, 상태가 변할 수 있다고 생각하는게 맞을 수 있다고 생각된다.
서로의 상태를 변화시킨다는 점을 확인하면서, 코드로 이런 부분들을 보기 위해 코드로 만들어보았다.
객체지향의 사실과 오해를 보면, '우아한 테크코스' 의 프리코스가 생각난다.
그래서 최대한 그 당시의 방식을 생각해보며, 조금씩 객체를 실제 프로젝트에 녹이는 연습을 해보려고 한다.
일단, 객체의 경우, Alice, Cake, Door, Fan, Mushroom, Tea를 만들었다.
위에서 이야기 한 객체 외에도, 실제 앨리스가 정원으로 가기 위해 지나가야 할 '문' 이라는 객체를 만들었다.
또한, 프로젝트를 실행했을 때 입력을 주고 받을 View를 만들었으며, 이들을 한 군데 모아서 동작시킬 컨트롤러를 만들었다.
결국적으로, '이상한 나라의 앨리스' 게임을 만들어보았다.
우리는 터미널을 이용해 앨리스가 이용할 객체가 무엇인지 정하고, 앨리스의 키를 바꿀 수 있다. 이를 토대로 문을 지나 앨리스를 정원에 보내야 하는 게임인 것이다.
이 중에서 객체의 협력과 상태변화에 초점을 둘 생각이다.
- 앨리스는 키와, 위치라는 상태를 가진다.
- 앨리스가 정원에 있으면 참을 반환한다.
- 앨리스가 '문'이라는 객체를 입력받아 이 문을 지나가는 시도를 한다.
4. 앨리스는 케이크를 먹고 키가 커진다. 이 때, 케이크가 없다면 에러처리하고 게임을 종료한다.
5. 앨리스는 차(음료)를 마시고 키가 작아진다. 이 때, 차가 더이상 남아있지 않다면 에러처리하고 게임을 종료한다.
6. 앨리스를 부채를 사용해 키가 작아진다. (부채의 내구도는 추가하지 않았다. )
7. 앨리스는 버섯의 왼쪽을 먹고 키가 커진다. 만약 버섯이 없다면, 에러처리하고 게임을 종료한다.
8. 앨리스는 버섯의 오른쪽을 먹고 키가 작아진다. 만약 버섯이 없다면, 에러처리하고 게임을 종료한다.
객체들을 다이어그램으로 정리해보았다.
모든 객체간의 협력에서, 객체의 상태는 변하게 된다.
또한, '문'이라는 객체는 앨리스의 키를 입력받아, 지나갈 수 있는지 없는지 검증해주었다.
스터디에서 서로 코드를 리뷰할 때, 객체간의 협력이라는 부분에서 못해온 사람은 없었다고 느꼈다.
하지만, 너무 불필요한 동작이 많았다고 느낀다.
이번 프로젝트에서 앨리스가 사용하는 모든 객체가 하는 일은 동일하다.
- 상태(인스턴스)로 자신의 용량이 있다.
- 앨리스가 사용하고, 자신의 상태를 변화시킨다.
그렇다면, 결국 똑같은 메서드들을 사용하게 된다. 이들을 더욱 효율적으로 쓰는 방법도 있다고 생각을 했다.
근데 그게 다음 장인 것 같다. 하하
다음장을 공부해보고 2장 리펙토링도 해봐야겠다.
그럼...twenty thousand...🔥
'개발공부 > 객체지향의 사실과 오해' 카테고리의 다른 글
[객(체지향의)사(실과)오(해)] 6. 객체지도 ( 태초마을로 간 지우 ) (1) | 2023.06.05 |
---|---|
[객(체지향의)사(실과)오(해)] 5. 책임과 메시지 (부제. 메시지란 무엇인가) (1) | 2023.06.05 |
[객(체지향의)사(실과)오(해)] 4. 역할, 책임, 협력 (부제 : 그래 팩토리를 더 써먹어보자) (0) | 2023.04.28 |
[객(체지향의)사(실과)오(해)] 3. 타입과 추상화( 부제 : 어...이거?!) (0) | 2023.04.28 |
[객(체지향의)사(실과)오(해)] 1장. 협력하는 객체들의 공동체 (1) | 2023.04.15 |