대부분의 클래스는 독자적인 자원으로만 제 역할을 다하기 힘든 경우가 많다.
따라서 클래스간 리소스는 의존하게 되고 이는 의존성으로 프로그램의 복잡도에 영향을 미친다.
여기서의 예제에서는 SpellCheck라는 클래스가 Dictionary를 사용하고 의존성을 가진다고 보자.
대표적으로 두 가지 부적절한 구현이 존재한다.
1) static 클래스의 사용
public class SpellChecker {
private static final Lexicon dictoary = new KoreanDictionary();
private SpellChecker(){
//Noninstatiable
}
public static boolean isvalid(String word){
throw new UnsupportedOperationException();
}
public static List<String> suggestions(String type){
throw new UnsupportedOperationException();
}
}
2) 싱글톤으로 구현
public class SpellChecker {
private final Lexicon dictoary = new KoreanDictionary();
private SpellChecker(){
//Noninstatiable
}
public static final SpellChecker INSTANCE = new SpellChecker();
public static boolean isvalid(String word){
throw new UnsupportedOperationException();
}
public static List<String> suggestions(String type){
throw new UnsupportedOperationException();
}
}
위와 같은 경우 코드상으로 어떠한 사전을 쓸것이라는 것이 고정되므로 가변적인 값에 의해 다양한 행동을 하기 힘들다.
즉 위 사전만 사용할수 있으며 다른 사전을 사용하는 Checker를 위해 또 다른 클래스가 필요할수 있다.
이를 위해서 생성자로 사전을 주입하는 방식을 보자.
public class SpellChecker {
private final Lexicon dictionary;
public SpellChecker(Lexicon dictionary){
this.dictionary = Objects.requireNonNull(dictionary);
}
public static boolean isvalid(String word){
throw new UnsupportedOperationException();
}
public static List<String> suggestions(String type){
throw new UnsupportedOperationException();
}
}
요약하자면 의존하는 리소스에 따라 행동을 달리하는 클래스를 만들 때는 싱글톤이나 스태틱 유틸 클래스를 사용하지 말자
'Study' 카테고리의 다른 글
Static 클래스의 noninstantiability (0) | 2022.11.08 |
---|---|
싱글톤 객체 생성 (0) | 2022.11.08 |
생성자 매개변수가 많은 경우에 빌더 사용을 고려 (0) | 2022.11.03 |
생성자 대신 Static 팩토리 메소드의 사용 (0) | 2022.11.02 |
정보처리기사 5과목 오답 (0) | 2022.02.23 |