그동안 SOLID를 너무 의식하고 있었던 것인지 객체지향에서 가장 중요한 것을 책임이라고 생각하고 있었는데, 행동(메세지)가 가장 중요한 것라고 한다. 객체지향의 기원으로 거슬러 올라가면 GUI 인터페이스의 도입과 맞물린다고 한다. GUI 인터페이스를 구현하려면 눈에 보이는 객체들을 위주로 프로그래밍 하는것이 효율적이기 때문이다. 그런데 그런 방식이 다른 곳에 접목시켜도 효과적이어서 주요한 패러다임이 되었다고 한다.
본론으로 돌아와서 행동이 가장 중요한 것이라고 했는데, 객체는 스스로 행동할 수 있다. 우리가 실생활에서 생각하는 객체와는 조금 다르다. 객체 스스로 상태를 갖고 변화시킬 수 있다. 무언가 변화시키려면 우리는 객체에게 요청을 해야한다. 현실세계의 커피는 내가 마셔야하는 것이지만, 객체지향 세계의 커피는 내 입 속에 들어오라고 요청을 해야 마실 수 있다.
객체의 자율성을 보장하는 바탕에는 객체가 상태를 가질 수 있다는 점이 있다. 객체 내부에 상태가 존재하기 때문에 객체가 스스로 상태를 변화시키며 외부의 도움 없이 자율적으로 행동할 수 있는 것이다. 이러한 객체는 자신의 상태를 외부에 노출해서는 안된다. 그래야 자율성이 보장되기 때문이다. 이 부분은 데이터 중심의 개발 방식을 생각해보면 쉽게 이해할 수 있을 듯 하다.
이러한 객체의 특성으로 인해 어떤 행동을 할지 정의하는게 중요한데, 이때 생각해야 하는것이 역할, 책임, 협력 등이고 이를 위해 객체지향 설계 기법들이 있는 것이다.
하지만 오늘 짠 소스들이 행동을 위주로 작성된건지 잘 모르겠다. 그래도 책임을 나름 잘 분리해서 그런지 모든 객체가 불변으로 작성됐다. 사실 이 점은 객체지향보다는 클린코딩에 가까운 내용인 것 같긴 하지만, 어쨋든 나름의 최선을 다한 것 같다. 이번에는 추상 팩토리도 적용해봤는데 enum과 함께 사용하니 아주 깔끔해진다. 좋다.
아쉬운 점
어제 결국 suffix array를 구현하지 못했다. nlogn 으로 구현하고 싶었는데 세부 구현에서 계속 안맞는 부분이 생겼다. 오늘은 cs10 미션을 하느라 마무리하지 못했는데 내일 알고리즘 풀이 이후 따로 정리하며 데브독스 문서도 함께 작성해야겠다.
덕분에 CS 수업도 듣지 못했다. 오늘 마저 들을까 했는데 이번 주 과제는 풀이 과정을 작성하는 것들이 대부분이라 조금 미뤄도 크게 문제되지 않을 것 같다.