Giken Dev
반응형

의존이란 무엇인가?

  • A 는 B 에 의존적이다.
    • A 는 B 의 변화에 민감하게 반응한다.
    • B 는 A 의 변화에 민감하게 반응한다고 할 수 없다.
  • 물건의 가격은 공급에 의존적이다.
    • 물건의 가격은 공급에 민감하게 반응한다.
    • 공급은 물건의 가격의 변화에 민감하게 반응한다고 할 수 없다.

 

 

 

클래스끼리 의존 관계 맺기

public class RealMessageSender {
	public void send() {
    	// 실제로 메시지 보내기
    }
}

public class FakeMessageSender {
	public void send() {
    	// 메시지는 안보내고 메시지를 보냈다는 로그만 찍기
    }
}

// Client 는 FakeMessageSender 에 의존
public class Client {
	public void someMethod() {
    	// 메시지 보내기 전 실행되는 어떤 작업
        
        FakeMessageSender messageSender = new FakeMessageSender();
        messageSender.send();       
    }
}

 

클래스끼리 의존 관계가 생기는 세가지 경우

  1. 다른 클래스의 레퍼런스 변수를 사용하는 경우
  2. 다른 클래스의 인스턴스를 생성하는 경우
  3. 다른 클래스를 상속받는 경우 

 

 

 

인터페이스를 통한 의존 관계 맺기

public interface MessageSender {
	void send();
}

public class RealMessageSender implements MessageSender {
	public void send() {
    	// 실제로 메시지 보내기
    }
}

public class FakeMessageSender implements MessageSender {
	public void send() {
    	// 메시지는 안보내고 메시지를 보냈다는 로그만 찍기
    }
}

public class Client {
    private MessageSender messageSender;
    
    // 의존성 주입
   	Client(MessageSender messageSender){
       	this.messageSender = messageSender;
	}

	public void someMethod() {    
    	// 메시지 보내기 전 실행되는 어떤 작업
        
        FakeMessageSender messageSender = new FakeMessageSender();
        messageSender.send();       
    }
}

messageSender 를 테스트용인 fake 로 쓰다가 real 로 바꿔야할 때에는, client 의 생성자에 real 을 넣어주기만 하면 됩니다.

 

이렇게 클래스가 아닌, 인터페이스를 통해서 의존 관계를 맺으면,

테스트와 실제 환경을 번갈아 사용할 때 용이합니다.

 

인터페이스를 통해서 의존 관계를 맺음으로써 1번과 2번의 경우를 해결할 수 있습니다.

  1. 다른 클래스의 레퍼런스 변수를 사용하는 경우
  2. 다른 클래스의 인스턴스를 생성하는 경우

 

 

강한 의존과 약한 의존

  • 강한 의존 (강한 결합)
    • 클래스끼리 의존 관계를 맺을 때
  • 약한 의존 (느슨한 결합)
    • 인터페이스를 통한 의존 관계를 맺을 때
    • 객체지향적임
반응형
profile

Giken Dev

@기켄

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