객체는 상태를 가지며 상태는 변경가능하다.
상태를 변경시키는 것은 객체의 행동이다
객체는 어떤 상태에 있더라도 유일하게 식별이 가능하다.
객체의 행동은 객체의 상태를 변경시키지만, 행동의 결과는 객체의 상태에 의존적이다.
부수효과를 초래한다는 것을 의미한다.객체는 상태, 행동, 식별자를 갖는다.
객체는 자율적이기에, 서로 다른 객체는 서로 간의 상태에 직접적으로 간섭하거나 접근할 수 없다.
행동은 다른 객체의 상태에 간접적인 접근이 가능하지만, 해당 접근에 대해서 상태를 바꿀지 말지 또한 해당 객체의 자율적인 선택이다.
상태 캡슐화
: 잘 정의된 행동 집합을 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.
식별자는 객체를 구분짓는 객체의 프로퍼티이다. (Entity : 식별자를 갖는 객체)
값 : 불변 상태 / 객체 : 가변 상태
동등성과 동일성 (equals vs ==)
: 상태가 다르더라도 식별자가 같다면 두 객체는 동일하다
: 어느 특정 시점에서의 값의 상태는 불변하기 때문에, 그 시점에서 동일한 타입의 두 값이 같다면 두 값은 동등하다
수동적인 현실의 객체도 객체지향에서의 객체는 능동적이다.
만들고 먹는 것에 따라 양이 변하는 케이크도 객체지향에서는 능동적으로 본인의 양을 변경한다. 눈에 보이지 않는 것도 시각화가 가능하며, 존재하지 않는 것 또한 존재하도록 할 수 있다. -> 의인화
즉 객체지향 세계는 현실 모방이 아닌, 하나의 창조이다.
개념
분류 : 어떤 객체를 어떤 개념으로 분류하느냐에 따라 객체지향의 품질이 달라진다.
객체지향의 품질을 높이기 위해 각각의 객체를 최선의 장소에 배치해서 직관적으로 분류하는 것이 중요하다.
개념의 필요성 : 추상화를 위한 도구이다. 여러 가지의 세분화된 복잡성을 쳐내고 하나의 공통적은 특징을 살려서 일반화를 통해 단순화를 하고, 추상화를 하는 것이다.
개념 -> 타입 TYPE
클래스 : 객체를 위한 정적인 도구
추상화 - 구체화 / 일반화 - 특수화 / 슈퍼 타입 - 서브 타입
동적으로 변하는 객체의 상태와, 상태를 변경하는 행동에 집중하자.
1달도 전에 읽은 책을 다시 펴서 읽었다. 제대로 된 코딩을 한번도 안해봤지만, 그래도 처음 도전한 숫자야구의 내 코드가 너무 형편없다는 걸 깨닫고 난 후 다시 읽어서 그런지 예전에 읽으면서 받은 느낌과는 다르게 다가오는 것 같다.
코딩을 할 때 한 번 더 해당 기능에 대해 생각해보고, 한 번 더 추상화를 해보며, 한 번 더 세분화에 대해서 생각하며, 결국 내가 만들고자 하는 기능이 무엇인지, 그에 맞는 행동과 상태를 가질 수 있는지에 대해 더 깊게 주의해야겠다.