객체 지향 설계의 5원칙 S.O.L.I.D
직무(기술) 인터뷰에서 자주 나오는 SOILD 원칙에 대해서 정리
SOILD 원칙이란 객체지향 설계에서 지켜줘야 할 5개의 SW 개발 원칙을 말한다.
- SRP (Single Responsibility Principle) : 단일 책임 원칙
- OCP (Open Closed Priciple) : 개방 폐쇄 원칙
- LSP (Listov Substituiton Priciple) : 리스코프 치환 원칙
- ISP (Interface Segregation Principle) : 인터페이스 분리 원칙
- DIP (Dependency Inversion Principle) : 의존 역전 원칙
의 앞 글자를 따서 SOILD 원칙이라 말하며 코드의 확장성과 유지보수 관리 가 수월해 지며 불필요한 복잡성을 제거 하여 개발의 생산성을 높일 수 있다는 장점이 있다.
S(단일 책임 원칙)란 무엇인가?
- S는 단일 책임 원칙을 의미한다.
- 하나의 객체가 하나의 책임만 져야한다.
- 클래스를 단 한가지 목표만 가지고 작성해야한다.
- 애플리케이션 모듈 전반에서 높은 유지보수성과 가시성 제어 기능을 유지하는 원칙
예시 )
청소기 클래스는 청소 메소드만 잘 구현하면 되지 화분에 물을 주고 드라이 까지 할 책임은 없다.
물론 다재다능한 청소기는 좋아보이지만, 만일 청소기가 고장나면 다른 기능까지도 사용을 못해지기 때문이다.
즉, 청소기는 청소만 잘하면 된다는 책임만 가지면 된다.
쉽게 말해 하나의 클래스로 너무 많은 일을 하지 말고 딱 한 가지 책임만 수행하라는 뜻으로 보면 된다.
O(개방 폐쇄 원칙)란 무엇인가?
- O는 개방-폐쇄 원칙을 의미한다.
- SW 컴포넌트는 확장에 관해 열려 있어야 하고 수정에 관해서는 닫혀있어야한다.
- 다른 개발자가 수행하기 위해 반드시 수정해야 하는 제약 사항을 클래스에 포함해서는 안된다. 다른 개발자가 클래스를 확장하기만 하면 원하는 작업을 할 수 있도록 작성해야한다.
- 다양하고 직관적이며 유해하지 않은 방식으로 소프트웨어 확장성을 유지해야한다.
자바 프로그래밍을 할때 사용하는 추상 클래스와 상속 클래스 관계 구축이다.
L(리스코프 치환 원칙)란 무엇인가
- L은 리스코프 치환 원칙을 의미한다.
- 파생 타입은 반드시 기본 타입을 완벽하게 대체 되어야 한다.
- 서브클래스의 객체는 슈퍼클래스의 객체와 반드시 같은 방식으로 동작해야한다.
- 타입 변환 후 뒤따라오는 런타임 타입 식별에 유용한 원칙이다.
자바에선 대표적으로 Collection 인터페이스를 LSP의 예로 들수있다.
Collection 타입의 객체에서 자료형을 LinkedList에서 전혀 다른 자료형 HashSet으로 바꿔도
add()
메서드를 실행하는데 있어 원래 의도대로 작동되기 때문이다.
한마디로 다형성 이용을 위해 부모 타입으로 메서드를 실행해도 의도대로 실행되도록 구성을 해줘야 하는 원칙이라 이해하면 된다.
public void myData() {
// Collection 인터페이스 타입으로 변수 선언
Collection data = new LinkedList();
data = new HashSet(); // 중간에 전혀 다른 자료형 클래스를 할당해도 호환됨
modify(data); // 메소드 실행
}
public void modify(Collection data){
list.add(1); // 인터페이스 구현 구조가 잘 잡혀있기 때문에 add 메소드 동작이 각기 자료형에 맞게 보장됨
// ...
}
I(인터페이스 분리 원칙)란 무엇인가?
- I는 인터페이스 분리 원칙을 의미한다.
- 클라이언트가 사용하지 않을 불필요한 메서드를 강제로 구현하게 해서는 안된다.
- 클라이언트가 사용하지 않을 메서드를 강제로 구현하는 일이 없을 때 까지 하나의 인터페이스를 2개 이상의 인터페이스로 분할하는 원칙이다.
말그대로 인터페이스를 구현할때 사용하지 않는 메서드는 분리하여 구현하는 원칙이다.
D(의존관계 역전 원칙)란 무엇인가
- D는 의존관계 역전 원칙이다.
- 구체화가 아닌 추상화에 의존해야 한다는 읨이ㅣ다.
- 다른 구상 모듈에 의존하는 구상 모듈대신, 구상 모듈을 결합하기 위한 추상 계층을 사용한다는 것을 의미한다.
- D는 구상모듈을 분리한다.
쉽게 말해 구현 클래스에 의존하지말고 인터페이스에 의존 하라는 뜻이다.
이렇게 하면 구상모듈은 분리된 상태를 유지하면서 다른 구상 모듈의 기능 또는 플러그인을 확장할 수 있습니다. 일반적으로 상위 구상 모듈과 하위 구상 모듈 사이에는 높은 결합이 발생한다.
의존 역전 원칙(D)는 각 클래스간의 결합도를 낮추는 것이다.
- 참고
'JAVA' 카테고리의 다른 글
| 정적바인딩과 동적 바인딩의 차이점은? (0) | 2023.08.07 |
|---|---|
| 집약 이란 무엇인가? (0) | 2023.08.03 |
| 추상화와 다형성의 차이는? (0) | 2023.08.03 |
| 자료구조 - 양방향 연결리스트 (DoublyLinkedList) JAVA (0) | 2023.02.13 |
| Java - BigInteger 함수 활용 (0) | 2023.02.07 |