본문 바로가기
Java/Elegant Objects

[엘레강트 오브젝트] 2. 학습 - (2) 최소한 뭔가는 캡슐화하세요

by 잭피 2021. 9. 5.
너무 많이 캡슐화하는 방식도 좋지 않지만, 아무것도 캡슐화하지 않는 방식 또한 바람직하지 않습니다

 

class Year {
	int read() {
		return System.currentTimeMillis() /
			/ (1000 * 60 * 60 * 24 * 30 * 12) - 1970;
	}
}

Year 클래스의 인스턴스는 어떤 것도 캡슐화하지 않기 때문에 이 클래스의 모든 객체들은 동일합니다

이렇게 아무것도 캡슐화하지 않는 방식은 바람직하지 않습니다

 

이처럼 프로퍼티가 없는 클래스는 객체지향 프로그로밍에서 악명 높은 정적 메서드와 유사합니다

아무런 상태, 식별자도 가지지 않고 오직 행동만을 포함합니다

인스턴스 생성과 실행을 엄격하게 분리하는 순수한 OOP에서는 기술적으로 프로퍼티가 없는 클래스를 만들 수 없습니다

 

순수한 OOP에서는 정적 메서드가 존재하지 않기 때문에 정적 메소드를 호출하는 일 역시 불가능합니다

다른 인스턴스를 통해 함수를 호출하도록 변경해봅시다

class Year {
	private Millis millis;
	Year(Millis msec) {
		this.millis = msec;
	}
	int read() {
		return this.millis.read()
			/ (1000 * 60 * 60 * 24 * 30 * 12) - 1970;
	}
}

Millis로 캡슐화한 후, 프로퍼티로 사용합니다

그리고 해당 인스턴스의 메소드를 호출합니다

Year의 설계는 더 나아지기는 했지만 완벽하지 않습니다

좀 더 완벽하게 바꾼다면 아래와 같습니다

class Year {
	private Number num;
	Year(final Millis msec) {
		this.num = msec.div(
			1000.mul(60).mul(60).mul(60).mul(30).mul(12)).min(1970);
		)
	}

	int read() {
		return this.num.intValue();
	}
}

Year 생성자에서 초기화할 때 해당 계산을 먼저한 후, 필요할 때 read() 메소드를 통해 호출하도록 합니다

 

 

 

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

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

댓글