JungMayo 2025. 4. 14. 03:13

// Logger 클래스 - 싱글톤
public class Logger {
    private static final Logger instance = new Logger();

    private Logger() {}

    public static Logger getInstance() {
        return instance;
    }

    public void log(String msg) {
        System.out.println("[LOG] " + msg);
    }
}

// UserService 클래스 - Logger에 강하게 결합
public class UserService {
    private final Logger logger = Logger.getInstance(); // 직접 의존 (결합도 높음)

    public void createUser(String name) {
        logger.log(name + " 사용자 생성됨");
    }
}

// Main
public class Main {
    public static void main(String[] args) {
        UserService service = new UserService();
        service.createUser("홍길동");
    }
}


---------------

// 인터페이스 정의
public interface Logger {
    void log(String msg);
}

// 싱글톤 구현체
public class ConsoleLogger implements Logger {
    private static final ConsoleLogger instance = new ConsoleLogger();

    private ConsoleLogger() {}

    public static ConsoleLogger getInstance() {
        return instance;
    }

    @Override
    public void log(String msg) {
        System.out.println("[Console] " + msg);
    }
}

// UserService 클래스 - 인터페이스에 의존
public class UserService {
    private final Logger logger;

    public UserService(Logger logger) {
        this.logger = logger;
    }

    public void createUser(String name) {
        logger.log(name + " 사용자 생성됨");
    }
}

// Main
public class Main {
    public static void main(String[] args) {
        Logger logger = ConsoleLogger.getInstance(); // 여전히 싱글톤 사용
        UserService service = new UserService(logger); // 느슨한 결합
        service.createUser("홍길동");
    }
}


결합도 낮추려면 생성자주입만으로 ㄱㅊ지만 개방폐쇄 완화시키기 위해서 인터페이스를 사용해야 기존코드 수정없이 사용가능