[기술 정리] 책임과 위임 그리고 의존

lhs's avatar
Nov 17, 2024
[기술 정리] 책임과 위임 그리고 의존
 

1. 책임(Responsibility)

  • 클래스가 수행해야 하는 기능이나 역할
  • 클래스는 자신의 책임을 명확하게 정의하고 수행해야 한다.
  • 단일 책임 원칙(SRP)에 따라 각 클래스는 하나의 책임만을 가져야 한다.
  • 책임은 클래스명과 깊은 상관관계가 있으므로, 클래스명을 잘 지어야 한다.
  • 예시
    • public class Calculator{ public int add(int a, int b){ return a + b; } public int sub(int a, int b){ return a - b; } public int mul(int a, int b){ return a * b; } public int div(int a, int b){ return a / b; } }
    • Calculator는 계산에 대한 책임을 가지고 있다.

2. 위임(Delegation)

  • 클래스가 자신의 책임 중 일부를 다른 클래스에 맡기는 것
  • 코드의 재사용성을 높이고, 클래스의 복잡도를 줄일 수 있다.
  • 클래스를 작고 단순하게 유지하면서 필요한 기능을 외부 클래스를 통해 구현할 수 있다.
  • 위임한 클래스는 위임받은 클래스에 의존한다.
  • 위임은 캡슐화와 결합도의 균형을 잘 맞추어야 하며, 과도한 위임은 코드의 이해도를 떨어뜨릴 수 있다.
  • 예시
    • public class Calculator { private Addition addition = new Addition(); private Subtraction subtraction = new Subtraction(); public int add(int a, int b) { return addition.add(a, b); } public int sub(int a, int b) { return subtraction.sub(a, b); } } public class Addition { public int add(int a, int b) { return a + b; } } public class Subtraction { public int sub(int a, int b) { return a - b; } }
    • Calculator 클래스는 AdditionSubtraction 클래스에 각자 덧셈과 뺄셈 기능을 위임했다.
    • Calculator 클래스는 책임을 위임함으로써 클래스의 복잡도를 줄였다.

3. 의존(Dependency)

  • 한 클래스가 다른 클래스의 기능을 사용하는 관계.
  • 의존하는 클래스는 상위 모듈이 되고, 의존 받는 클래스는 하위 모듈이 된다.
  • 의존 받는 클래스가 변경되면 이를 사용하는 클래스에 영향을 미칠 수 있기 때문에, 결합도를 낮추는 것이 중요하다.
  • 의존성 역전 원칙(DIP)을 적용하면, 상위 모듈이 구체적인 하위 모듈에 의존하지 않고 추상화에 의존하게 되어 결합도를 낮출 수 있다.
  • 의존성 주입(Dependency Injection) 등의 기법을 사용하면 결합도를 낮추고, 유연한 시스템 설계가 가능하다.
  • 예외로, 기본 클래스(예: String, Integer, ArrayList 등)를 사용하는 것은 이미 시스템에서 제공하는 라이브러리 내에서 사용하는 것이므로 의존성을 고려할 필요가 없다.
  • 위임의 예시로 들면, Calculator 클래스는 AdditionSubtraction 클래스에 의존한다.

4. 의존성 주입(Dependency Injection,DI)

  • 객체가 자신의 의존 객체를 직접 생성하는 것이 아니라 외부에서 주입받는 방식
  • 의존성 주입을 통해 상위 모듈과 하위 모듈 간의 결합도를 낮출 수 있다.
  • 객체 간의 의존 관계를 외부에서 관리할 수 있어 유연한 시스템 설계가 가능하다.
  • 주입 방식으로는 생성자 주입, 세터 주입, 필드 주입 등이 있다.
  • 예시
    • public class Calculator { private Addition addition; private Subtraction subtraction; public Calculator(Addition addition, Subtraction subtraction) { this.addition = addition; this.subtraction = subtraction; } public int add(int a, int b) { return addition.add(a, b); } public int sub(int a, int b) { return subtraction.sub(a, b); } } public class Addition { public int add(int a, int b) { return a + b; } } public class Subtraction { public int sub(int a, int b) { return a - b; } }
    • 위임의 예시를 의존성 주입으로 바꾼 예시
    • Calculator 클래스는 이제 AdditionSubtraction 객체를 생성자를 통해 외부에서 주입받는다.
Share article

LHS's Study Space