본문 바로가기
Java/Elegant Objects

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

by 잭피 2021. 9. 4.
모든 것은 유지보수성과 관련이 있습니다

 

복잡성이 높을수록 유지보수성이 저하되고, 시간과 돈이 낭비되며, 고객 만족도가 떨어집니다

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

 

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

class Cash {
	private Integer digits;
	private Integer cents;
	private String currency;
}

Cash 클래스는 3개의 객체를 캡슐화하고 있습니다

이 3개의 객체들이 함께 모여 Cash 클래스 객체를 식별합니다

동일한 값의 달러, 센터, 통화를 가진 2개의 객체가 있다고 하면 두 객체는 서로 동일할까요?

아닙니다.

 

Java 언어가 안고 있는 설계적 결함때문에 같지 않습니다

Java를 비롯한 대부분 OOP 언어에서 객체는 단지 메서가 추가된 데이터 집합일 뿐입니다

객체는 데이터를 저장할 수 있는 껍질과 유사합니다

Object x = new Object()
Object y = new Object()
x == y // false

위 예제에서 두 객체는 서로 다른 껍질이기 때문에 동일하지 않습니다

이것이 Java가 객체를 바라보는 방식입니다

 

따라서 상태 없는 객체는 존재해서는 안되고, 상태는 객체의 식별자여야 합니다

 

그럼 캡슐화하기에 적합한 객체의 수는 왜 4개일까요?

자동차는 제조사, 모델, 제조년도라는 특성으로 구성되어 있습니다

이 3가지 특성을 사용하면 자신의 자동차를 식별할 수 있습니다

사람은 이름과 생년월일, 이 2가지 특성을 이용하면 저를 찾을 수 있습니다

근데 만약 4개 이상의 요소로 구성되어 있다면 이해하기가 어렵습니다

 

그런데 이웃의 누군가가 동일한 제조사, 모델, 제조년도의 자동차를 가지고 있다면?

→ 당연히 실세계의 자동차가 객체지향세계의 자동차보다 복잡할 수 밖에 없습니다

 

하지만 위의 문제를 해결해본다면,

자동차 객체는 타입과 차량 인식 번호를 캡슐화하고, 타입에 제조사, 모델, 제조년도를 캡슐화합니다

결과적으로 자동차 객체는 3개의 작은 개체를 포함하게 됩니다

그리고 Java의 결함을 해결하기 위해 == 연산자를 사용하지 말고 항상 equals() 메서드를 오버라이드 하세요

(Lombok의 @EqualsAndHashCode 어노테이션을 사용하는 방법도 있습니다)

 

더 많은 객체가 필요로 하다면 클래스를 더 작은 클래스로 분해하자

 

 

이 글은 학습을 위해 “엘레강트 오브젝트" 책 내용을 정리한 글입니다.

저작권 관련 문제가 있다면 바로 삭제하도록 하겠습니다

댓글