[자라기] - 생성자

김주형·2022년 11월 10일
0

자라기

목록 보기
5/22

Reference

다음을 참고하여 작성되었습니다. 감사드립니다. 🙇🏻‍♂️


생성자 주입, this 고민하기

🤓 생성자? 알고 쓰자!

  1. 인스턴스를 생성할 때 지정
  2. 클래스와 동일한 이름의 메소드를 호출하도록 약속되어 있음
  3. 클래스가 인스턴스화 될 때 실행되어야 할 코드를 생성자 안에 정의하는 것을 통해 초기화 가능
  4. 클래스가 인스턴스화 될 때 구분자를 통해 매개변수를 생성자의 인자로 넘겨받는다.
  5. 생성자에 지정된 매개변수는 new() 연산자를 통해 해당 클래스의 인스턴스 변수로 대입된다.
  6. 생성자는 static, return 데이터 타입을 지정하지 않는다. 오로지 자신의 클래스 타입만 지정된다.
  7. 생성자 자신의 클래스에서 인스턴스 변수가 지정되지 않으면 아무것도 실행되지 않는다. 그렇기 때문에 this를 사용한다.
  8. this는 클래스 자신의 인스턴스를 가리킨다.
  9. this.equals(자신의 인스턴스 변수), = 연산자에 대입되는 변수.equals(생성자를 통해 주입되는 매개변수)
public class A {  
  
    private 데이터타입 instance;
    private 데이터타입 instance;
  
    public A (데이터타입 parameter) {  
  
        this.instance = parameter;
  
    }
    
public class B {

	private B instance;

	public B ( A parameter ) {
		this.instance = parameter;
	}
}

의존성 주입! DI 고민하기

  1. 객체 자신이 사용할 객체를 스스로 생성할 경우, 클래스에 대한 의존이 발생한다. -> 단일 책임, 개방 폐쇄, 의존관계 역전 원칙.. 위반

    "과연 누가 외부 객체를 초기화 해야할까?" 라는 고민을 마주치게 된다.

  2. 필요한 객체를 직접 생성하거나 찾지 않고 외부에서 넣어주는 방식으로 해결할 수 있다. (의존성 주입)
  3. "외부에서 사용할 객체를 전달받을 수 있는 생성자를 추가하는 방법을 제공하는 것"을 의미한다.
  4. 메인 메서드에서 각 객체들이 사용할 객체를 주입하는 것이 가능하다.
public class Application {
    public static void main(String[] args) {
        A a = new A(parameter);
        B b = new B(parameter);
    }

}

객체 조립 이해해보기

  1. ""외부 객체를 누가 초기화 해야할까?"
    • 클래스와 동일한 이름의 메소드를 호출하도록 약속되어있는 생성자가 존재한다.
    • 생성자에 지정된 매개변수는 new() 연산자를 통해 해당 클래스의 인스턴스 변수로 대입된다.
  2. ""외부에서 의존성을 주입할 수 있다."
    • 외부에서 사용할 객체를 전달받을 수 있는 생성자를 추가하는 방법을 활용하면
    • 객체는 필요한 객체를 스스로 생성하거나 찾지 않고 외부에서 넣어주는 방식으로 해결할 수 있다. (이것을 의존성 주입이라고 한다.)

부모에게 상속받거나 new() 연산자를 통해서만 다른 객체의 협력과 제어의 흐름이 가능한 것인줄만 알았던 것 같다..

2까지의 사실들을 응용하면 어떻게 될까?

1. 역할 책임 A, B / 구현 책임 A,B

public interface InterfaceA {
 	featureA();
    
...
}

public class implementationA implements InterfaceA {
	@Override
    featureA(){
    ...
    }
}
public interface InterfaceB {
 	featureB();
    
...
}

public class implementationB implements InterfaceB{
	@Override
    featureB(){
    ...
    }
}

public class AppConfig {
      public InterfaceA interfaceA() {
          return new implementationA(new implementationB());
	}
}
profile
왔을때보다좋은곳으로

0개의 댓글