티스토리 뷰

SOLID

S: 단일 책임 원칙(Single responsibility principle: SRP)

클래스는 단 하나의 책임을 가져야 한다. 단일책임원칙을 지키지 않으면 작은 이유로도 다수의 클래스가 변경될 수 있다.

O: 개방-폐쇄 원칙(Open-closed principle: OCP)

확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다. 즉, 기능은 변경하거나 확장할 수 있으면서 그 기능을 사용하는 코드는 수정하지 않는다.

  • 변화하는 부분을 추상화한다.

개방폐쇄원칙이 깨질 때 주요 증상

  • 다운캐스팅, instanceof와 같은 타입 확인 연산자 사용
  • 비슷한 if-else문이 존재

L: 리스코프 치환 원칙(Liskov substitution principle: LSP)

상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상 작동해야 한다.

  • 직사각형과 정사각형의 예시를 든다. 개념상 상속관계일 수 있으나 실제 프로그램에서는 상속관계로 묶이지 않기 때문에 발생하는 문제이다. 개념상 상속관계보다 실제적으로 상속관계를 이루는지 확인해야 한다.
  • 리스코프 치환 원칙은 계약과 확장에 관한 것이다. 명시된 명세에서 벗어난 값을 리턴하거나, 벗어난 익셉션을 발생하거나, 벗어난 기능을 수행하는 것은 원칙을 위반하는 사례들이다.
  • 리스코프 치환 원칙을 위반하면 개방-폐쇄 원칙을 위반할 가능성이 높다.

I: 인터페이스 분리 원칙(Interface segregation principle: ISP)

클라이언트는 자신이 사용하는 메서드에만 의존해야 한다. 즉, 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.

  • 클라이언트(소비자)에 대한 내용이다. 클라이언트가 사용하는 기능을 중심으로 인터페이스를 분리하여 클라이언트 단위로 관리한다. 한 클라이언트의 변경사항이 다른 클라이언트에 영향을 주지 않는다.

D: 의존 역전 원칙(Dependency inversion principle: DIP)

고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 된다. 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.

  • 리스코프 치환원칙과 개방폐쇄 원칙을 따르는 설계를 만들어 주는 기반이 된다.
  • 구체화된 내용을 소유하지 않고 고수준 모듈에서 정의한 추상 타입에 맞게 구체회된 저수준을 사용한다. 구체적인 내용의 변경에 따른 고수준 모듈이 변경되지 않게 된다.

용어정리

  • 고수준 모듈: 의미있는 단일 기능을 제공하는 모듈.
    (예시: 사진을 읽어와 압축해서 보낸다.)
  • 저수준 모듈: 고수준 모듈의 기능을 구현하기 위해 필요한 하위 기능의 실제 구현(구체화)
    (예시: 파일에서 사진을 읽어온다. 00압축방법으로 압축한다. 압축한 파일을 보낸다)

정리

SOLID 원칙에 대한 내용일 읽고 정리하면서 느낀 점은 객체지향의 포인트는 추상화를 통해 변경에 유연하게 한다는 것이다.

단일책임원칙과 인터페이스 분리 원칙은 작은 단위의 객체를 유지할 수 있게 한다. 리스코프치환원칙과 의존역전원칙은 개방폐쇄원칙을 지원하여 변경하지 않고 기능확장이 가능하도록 한다.

기능을 중심으로 공통점과 차이점을 찾아내서 차이점(변경되는 부분)을 추상화하는 것이 객체지향 설계의 핵심이라고 생각한다.

참고

  • [책] 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함