꾸준한 스터디

어플리케이션을 만들다보면 어떤한 객체의 기능을 공통적으로 사용해야 하는 경우가 생긴다.

예를 들어 맞춤법 검사기라는 객체를 만들고 맞춤법 검사하는 메서드를 만들어

어디에서든 문장값이 주어지면 맞춤법이 맞는지 true, false 값을 내뱉는 메서드를 만든다고 가정했을 때

 

개발자는 정적 유틸리티 클래스를 만들어  전역으로 사용하려 할 수 있다.

 

맞춤법 검사를 할때 받은 문자열을 확인하려면 사전객체에 의존하게 된다.

클래스 내에 사전 객체가 생성되어 사용하는데 이 사전객체를 개발 초기에는 한글사전만 필요하다고 했다 치더라도

어플리케이션이 커져가며 영어도 검사하고 일본어, 중국어도 검사하게 될 가능성이 있다면

클래스에서 여러 자원 인스턴스를 지원하게 해야 유연해진다.

 

정적 유틸리티 클래스와 싱글턴 방식은 1개의 인스턴스만 사용할 수 있으니 적합하지 않다. 1개인 인스턴스에 어디에선 한글 사전을 넣고 어디에선 영어 사전을 넣는다면 동기화되어 멀티스레드 환경에서 원치않는 결과가 나올 수 있다.

 

public class SpellChecker {

    /******************정적 유틸리티 클래스*******************/
    // 다른 사전은 받을 수 없고 선언한 사전만 받게 된다.
    private static final Dictionary dictionary = new Dictionary();

    private SpellCheacker() {}
    
    public static boolean isValid(String word) {
    	...
    	return dictionary.contains(word);
    }

    ...

    /******************싱글턴******************/
    // 다른 사전은 받을 수 없고 선언한 사전만 받게 된다.
    private final Dictionary dictionary = new Dictionary();

    private SpellCheacker() {}

    public static final Spellchecker INSTANCE = new SpellCheacker();
    
    public boolean isValid(String word) {
    	...
    	return dictionary.contains(word);
    }

    ...
    
}

 

인스턴스를 생성할 때 생성자에 사용할 자원을 넘겨 그때 그때 필요한 기능을 쓰게 하는게 좋다. 이는 의존 객체 주입의 한 형태이다.  이렇게 하기 위해서는 인터페이스 기반의 코딩이 필요하다.

// 사전 인터페이스 클래스
public interface Dictionary {

	boolean contains(String word);
    
    ...
}

// 사전 인터페이스를 구현한 한글 사전 클래스
public class HangleDictionary implements Dictionary {

	@Override
    public boolean isValid(String word) {
    	...
        return false;
    }
    
    ...
}

// 클라이언트 클래스
public class SpellChecker {
	
    private final Dictionary dictionary;
    
    // 생성자에서 받는 사전에 따라 해당 기능 사용
    private spellChecker(Dictionary dictionary) {
    	this. dictionary = dictionary;
    }
    
    public boolean isValid(String word) {
    	...
        return dictionaery.contains(word);
    }
    
}

 

 

 

 

profile

꾸준한 스터디

@StudyRecord

포스팅이 유익하셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!