OCP 를 한문장으로 정리하면 아래와 같습니다.
확장에 대해서는 개방적이고 수정은 폐쇄적이어야 한다.
OCP 자료 참고한 영상이 있는데 OCP 원칙을 예시로 IT 기업인 애플로 비유했을 때 이해가 확 되었다.
애플의 제품들을 보면 다른 기기와 호환성을 별로 였지만, 애플 기기간에 호환성을 최고이다 .
즉 아이폰, 맥북, 아이패드, 에어팟의 호환성은 애플만의 감성 영역이고 생태계를 잘 구성해놓은것 같다.
어디까지 비유이지만 수정에 대해서 닫혀 있어야 하고 확장에는 열려있어야 한다면 생각해봐야 하는 게
추상화와 다형성이 아닐까 한다.
OCP가 어려운 내용은 아니고 변경이 될만한 부분에 대해서 생각해보고 인터페이스 or 추상클래스로 추상화를 한 후 다형성을 이용한 확장을 가능하게 하는 설계의 원칙이다. OCP 를 잘 적용하기 위해서는 추상화를 잘 해야 할 필요가 있는데 컴퓨터 과학에서 추상화 라고 하면 어떤 종류의 대상들에 대해 그것이 가져야 할 핵심적인 특징들을 가지는 것이라고 정의를 했다
UML의 아버지 - 그래디 부치(Grady Booch)'의 말을 인용을 하면
추상화란 다른 모든 종류의 객체로부터 식별될 수 있는 객체의 본질적인 특징
이라고 정의를 했다.
인터페이스 or 추상 클래스 설계 단계에서 어떤 객체의 본질적으로 특징이 무엇인지 정의를 하고 이걸 구현 클래스로 전파를 하여 객체 생성 시 주입을 해주면 된다
예를 들어 아래 요구 사항 참고하여 파일을 생성하는 기능이 필요하다고 가정을 해보겠습니다.
- Excel 파일로 정보를 넣고 생성하는 기능이 필요
요구 사항을 살펴보면 Excel 파일을 생성하는 기능이 필요한 것 같다.
하지만 Excel 파일 고객 요구 사항에 따라 PDF 나 word 또는 한글 파일로 변환이 필요하다고 할 경우
추상화를 안해두었다면 코드 변경이 많이 필요할 것입니다.
FileGenerator라는 인터페이스로 추상화를 한 뒤 고객의 요구 사항이 변경이 될 때 구현 클래스를 교체해주면서 기능 확장을 열어두고 변경 사항을 생기더라도 Client 의 변경은 닫혀있는 구조가 된다 즉 추상화 layer 를 적용하면서 OCP 를 지키고 있는 것을 볼 수 있습니다.
설계 내용을 아래와 같이 코드로 구현 했습니다.
우선 FileGenerator 인터페이스를 선언해 주었습니다.
public interface FileGenerator {
// 파일 생성 함수
void generatorFile();
}
그리고 구현 클래스인 Excel,Pdf,Word FileGenerator 클래스를 FileGenerator 인터페이스를 implments 하여 구현했습니다.
public class ExcelFileGenerator implements FileGenerator {
@Override
public void generatorFile() {
System.out.println("Excel 파일 생성 중입니다.");
}
}
public class PdfFileGenerator implements FileGenerator {
@Override
public void generatorFile() {
System.out.println("PDF파일 생성 중입니다.");
}
}
public class WordFileGenerator implements FileGenerator {
@Override
public void generatorFile() {
System.out.println("Word 파일 생성 중입니다.");
}
}
그리고 Client 클래스에서는 FileGenerator 인터페이스를 참조하여 main 함수에 구현클래스를 주입하여 generatorFile 을 호출했습니다.
public class Client {
private FileGenerator fileGenerator;
// Client 는 FileGenerator 에 주입 받은 객체를 사용
public Client(FileGenerator fileGenerator) {
this.fileGenerator = fileGenerator;
}
void generatorFile() {
fileGenerator.generatorFile();
}
public static void main(String[] args) {
Client excelClient = new Client(new ExcelFileGenerator());
excelClient.generatorFile(); // Excel 파일 생성중 입니다.
Client pdfClient = new Client(new PdfFileGenerator());
pdfClient.generatorFile(); // PDF 파일 생성중 입니다.
Client wordClient = new Client(new WordFileGenerator());
wordClient.generatorFile(); // Word 파일 생성중 입니다.
}
}
간단하게 객체 지향 특성 중 추상화와 다형성을 활용하여 유연하게 기능 추가를 할 수 있는 예시를 보았습니다. OCP는 변경이 되는 부분에 추상 레이어를 적용하여 변경 범위를 최소화하고 확장에는 열려있는 원칙을 의미 하는 것 같습니다.
'개발이야기 > Design Pattern' 카테고리의 다른 글
객체 지향 SOLID 원칙 - DIP (0) | 2024.11.01 |
---|---|
객체 지향 SOLID 원칙 - ISP (1) | 2024.10.31 |
객체 지향 SOLID 원칙 - SRP 편 (3) | 2024.10.28 |
디자인 패턴에 대한 필요성과 이해 (0) | 2024.10.14 |