Study/object

[엘레강트 오브젝트] 2-1장 가능하면 적게 캡슐화하세요.

에디개발자 2021. 8. 12. 07:00
반응형

나를 닮았다고 한다...

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다.

책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다.

 

이 책에서는 4개 또는 그 이하의 객체를 캡슐화할 것을 권장합니다.

내부에 캡슐화된 객체 전체를 가리켜 객체의 '상태' 또는 ' 식별자' 라고 부릅니다. 

class Cash(
    private val digits: Int,
    private val cents: Int,
    private val currency: String
)

 

Cash 클래스는 3개의 객체를 캡슐화하고 있습니다. 반대로 3개의 객체가 모여서 Cash 클래스의 객체를 식별할 수 있습니다. 

 

상태 관점으로 바라보는 객체

val CashA = Cash(29, 92, "USD")
val CashB = Cash(29, 92, "USD")

CashA == CashB  // true

같은 3개의 객체로 캡슐화한 2개의 클래스는 서로 동일합니다. 

상태 관점으로 바라본 클래스

 

식별자 관점으로 바라보는 객체

val CashA = Cash(29, 92, "USD")
val CashB = Cash(29, 92, "USD")

CashA == CashB  // false

 같은 3개의 객체로 캡슐화한 2개의 클래스는 동일하지 않습니다.

식별자 관점으로 바라본 클래스

 

상태와 식별자로 왜 구분하는 걸까?

먼저 Stack, Heap에 대해서 이해를 하고 있어야합니다.  [ 자바 데이터 타입 ]

Java에서 객체를 선언하게 되면 Heap 영역에 실제 데이터가 쌓이게되고 Stack 영역에 Heap 영역의 주소값이 쌓이게 됩니다. 여기서 식별자는 Stack 영역에 쌓인 주소값이 되고 상태는 Heap 영역에 쌓인 데이터가 됩니다.

그림에서 보면 알 수 있듯이 상태값을 동일합니다. 하지만 주소값은 Stack 영역에 쌓일 때마다 값이 변경되지 때문에 식별자는 값이 다릅니다.

 

요점은 4개 이상의 좌표는 직관에 위배된다.

객체의 식별자는 세계 안에서 객체가 위치하는 좌표입니다. 세계 안의 객체를 바라보는 우리의 사고방식으로 4개 이상의 요소로 구성된 좌표를 이해하는 것은 어렵습니다. 

 

수십 개의 객체를 캡슐화하고 있는 클래스를 마주한 적이 있었으나 이 클래스는 완전히 잘못된 방식으로 구현된 것입니다. 클래스는 최대 4개의 객체로 캡슐화되어야 합니다.

 

 

 

이 책의 내용이나 제 생각과 다른 의견이 있으시면 댓글을 달아주세요. :)
반응형