규칙 7. 인스턴스 변수가 2개 이상인 클래스를 쓰지 않는다.
클래스의 인스턴스 변수의 수를 제한하라는 원칙이다. 여기서 말하는 인스턴스 변수는 원시타입, 문자열 또는 컬렉션을 포함한 기본 자료구조를 의미한다.
클래스에서 인스턴스 변수는 클래스가 관리하는 '상태'를 의미한다. 클래스의 상태는 정체성을 나타내는 요소로 상태가 많다는 것은 정체성 또한 많이 가지고 설계되었다는 것을 의미한다.
우리는 이전에 비슷한 문제를 해결한 경험이 있다. 세 번째 규칙인 '모든 원시값과 문자열을 포장한다.'에서 상태에 도메인적인 의미를 부여해보았다. 일곱 번째 지침에서는 의미를 가지는 상태를 효율적으로 관리하는 법을 이야기한다.
예시
다음과 같이 제목, 작가, 카테고리, 출판사, 가격의 속성을 가지는 Book 클래스가 있다. 이 클래스에서는 제목, 작가 등 각자의 도메인적 요소를 가지는 상태들이 Book라는 한 클래스에서 String, int 등 기본적인 자료구조로 관리되고 있다. 이는 곧 Book이라는 클래스 안에서 모든 상태들의 도메인적 오구사항을 구현해야 함을 의미한다.
아래 예시에서 생각해볼 수 있는 도메인적 요구사항은 간단한 수정 정도밖에 없어 한 클래스에서 관리하는 것이 더 효율적일 것이라 생각할 수 있다. 하지만 클래스의 규모가 커지고 그에 따른 요구사항이 많아질수록 하나의 클래스에서 관리하는 것은 힘들어질 것이다.
public class Book {
private String title; // 제목
private String author; // 작가
private String category; // 카테고리
private String publisher; // 출판사
private int price; // 가격
}
다음은 위의 Book 클래스의 모든 인스턴스 변수들을 포장하여 새로운 Book 클래스를 만든 것이다. 이제 우리는 Book에 모여있던 요구사항들을 관심사에 맞게 쪼갤 수 있다. 클래스의 수는 많아졌지만 클래스를 더욱 효율적으로 관리할 수 있게 되었다.
public class Book {
private Title title; // 제목
private Author author; // 작가
private Category category; // 카테고리
private Publisher publisher; // 출판사
private Price price; // 가격
}
class Title {
private String title;
}
class Author {
private String author;
}
...