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;
}
}
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
클래스는 Addition
과 Subtraction
클래스에 각자 덧셈과 뺄셈 기능을 위임했다.Calculator
클래스는 책임을 위임함으로써 클래스의 복잡도를 줄였다.3. 의존(Dependency)
- 한 클래스가 다른 클래스의 기능을 사용하는 관계.
- 의존하는 클래스는 상위 모듈이 되고, 의존 받는 클래스는 하위 모듈이 된다.
- 의존 받는 클래스가 변경되면 이를 사용하는 클래스에 영향을 미칠 수 있기 때문에, 결합도를 낮추는 것이 중요하다.
- 의존성 역전 원칙(DIP)을 적용하면, 상위 모듈이 구체적인 하위 모듈에 의존하지 않고 추상화에 의존하게 되어 결합도를 낮출 수 있다.
- 의존성 주입(Dependency Injection) 등의 기법을 사용하면 결합도를 낮추고, 유연한 시스템 설계가 가능하다.
- 예외로, 기본 클래스(예:
String
,Integer
,ArrayList
등)를 사용하는 것은 이미 시스템에서 제공하는 라이브러리 내에서 사용하는 것이므로 의존성을 고려할 필요가 없다.
- 위임의 예시로 들면,
Calculator
클래스는Addition
과Subtraction
클래스에 의존한다.
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
클래스는 이제 Addition
과 Subtraction
객체를 생성자를 통해 외부에서 주입받는다.Share article