모든 것은 유지보수성과 관련이 있습니다
복잡성이 높을수록 유지보수성이 저하되고, 시간과 돈이 낭비되며, 고객 만족도가 떨어집니다
따라서 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 어노테이션을 사용하는 방법도 있습니다)
더 많은 객체가 필요로 하다면 클래스를 더 작은 클래스로 분해하자
이 글은 학습을 위해 “엘레강트 오브젝트" 책 내용을 정리한 글입니다.
저작권 관련 문제가 있다면 바로 삭제하도록 하겠습니다
'Java > Elegant Objects' 카테고리의 다른 글
[엘레강트 오브젝트] 2. 학습 - (3) 항상 인터페이스를 사용하세요 (0) | 2021.09.05 |
---|---|
[엘레강트 오브젝트] 2. 학습 - (2) 최소한 뭔가는 캡슐화하세요 (0) | 2021.09.05 |
[엘레강트 오브젝트] 1. 출생 - (3) 생성자에 코드를 넣지 마세요 (0) | 2021.09.02 |
[엘레강트 오브젝트] 1. 출생 - (2) 생성자 하나를 주 생성자로 만드세요 (0) | 2021.09.02 |
[엘레강트 오브젝트] 1. 출생 - (1) '-er'로 끝나는 이름을 사용하지 마세요 (0) | 2021.09.01 |
댓글