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