객체 지향 설계 SOLID 원칙
두문자 | 약어 | 이름 | 개념 |
S | SRP | 단일 책임 원칙 Single Responsibility Principle |
한 클래스는 하나의 책임을 가져야 한다. |
O | OCP | 개방-폐쇄 원칙 Open-Closed Principle |
소프트웨어 개체(클래스, 모듈 등)는 확장에는 열려있으나, 수정에는 닫혀 있어야 한다. |
L | LSP | 리스코프 치환 원칙 Liskov Substitution Principle |
객체의 정확성을 깨뜨리지 않으면서 상위클래스의 객체를 하위클래스의 객체로 바꿀 수 있어야한다. |
I | ISP | 인터페이스 분리 원칙 Interface Segregation Principle |
범용적인 인터페이스보다 클라이언트를 위한 인터페이스 여러개가 더 낫다. |
D | DIP | 의존관계 역전 원칙 Dependency Inversion Principle |
추상화에 의존해야지, 구체화에 의존하면 안된다. |
SRP 단일 책임 원칙이란
한 클래스는 하나의 책임을 가져야 한다.
단일 책임 원칙이란 모든 객체는 하나의 책임만 가지며, 객체는 그 책임을 완전히 캡슐화 해야한다는 원칙입니다. 한개의 객체에 책임이 많아질 수록 변경이 자주 일어나며 객체간의 의존성과 결합도가 높아질 것입니다.
단일 책임 원칙의 예
문서를 작성하고 프린터로 출력하는 객체를 만들어 보겠습니다.
1. SRP 적용 전
public class Printer {
private String text;
public void write(String text) {
this.text = text;
}
public void print() {
System.out.println(text);
}
}
public class Main {
public static void main(String[] args) {
Printer printer = new Printer();
printer.write("보고서 작성");
printer.print(); // 보고서 작성
}
}
언뜻보면 잘 만들어진 것 같지만 Printer는 2가지의 책임을 가지고 있습니다. 현실에서 생각해보아도 프린터에서 글을 쓰고 용지를 선택하지 않습니다. 프린터는 출력하는 일만 하고, 문서에서 글을 쓰는 일만 합니다.
2. SRP 적용 후
public class Printer {
private Paper paper;
public Printer(Paper paper) {
this.paper = paper;
}
public void print() {
System.out.println(paper);
}
}
public class Paper {
private String text;
public void write(String text) {
this.text = text;
}
@Override
public String toString() {
return text;
}
}
public class Main {
public static void main(String[] args) {
Paper paper = new Paper();
paper.write("보고서 작성");
Printer printer = new Printer(paper);
printer.print(); // 보고서 작성
}
}
Printer와 Paper의 책임을 분리했습니다. Printer는 출력기능만 존재하고, Paper는 문서를 작성하는 기능만 존재합니다.