본문으로 바로가기

[객체지향] SOLID 5원칙!!

category Computer/객체지향 2019. 1. 8. 18:03


  1. SOLID는 무엇인가
    • 객체지향 개발 5대 원리

      2.
           SOLID의 내용
    1.SRP(단일 책임의 원칙: Single Responsibility Principle)
    • 정의 
      • There should never be more than one reason for a class to change
      • 클래스는 프로그램에서 제공하는 기능의 단 한 부분(책임)만을 가져야 한다.
      • 해당 책임은 클래스 내부에 캡슐화 되어야 한다.
      • 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집중되어 있어야 한다.
      • " A class should have only one reason to change"
      • 단일 책임의 원칙은 Object에만 한정되는것이 아니라 method, Field , variable 도 해당된다. 
    • 적용 방법
      • 클래스는 자신의 이름이 나타내는 일을 해야 한다. 올바른 클래스 이름은 해당 클래스의 책임을 나타낼 수 있는 가장 좋은 방법이다.
      • 클래스 내부에서 변경이 일어나는 필드와 그렇지 않은 필드를 각각의 클래스로 분리한다.

2.OCP(개방 폐쇄 원칙 : Open Close Principle)
      • 정의
          • 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화해야한다는 원칙
          • 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성 요소는 수정이 일어나지 말아야 하며(캡슐화를 통해 내부내용을 감춘다), 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다.
          • 관리 가능하고 재사용 가능한 코드를 만드는 기반 원칙
      • 적용 방법
          • 추상화, 다형성 -> 상속 , interface
          • 변경될것과 변경되지 않을것을 엄격히 구분
          • 이 두 부분의 접점에 인터페이스를 정의
          • 인터페이스에 의존하도록 코드 작성
     3.LSP(리스코프 치환의 법칙: Liskov Substitution Principle)
      • 정의
          • 서브타입은 언제나 기반 타임으로 교체할 수 있어야 한다
          • 사용자는 파생클래스에 대해 알 필요가 없다.
          • 상속을 할때 지켜야할 규칙
          • 상속은 코드의 재사용을 위해서가 아니라 명확한 가족 관계가 있을때 사용
          • 가족관계 - 부모, 형제들의 형질과 관련없는 능력을 가진 파생이 없는 관계
          • 부모와 파생된 객체들이 존재할때 가능한 모두 동일한 메소드이름과 갯수를 가지게 한다.
   4.ISP(인터페이스 분리의 원칙 : Interface Segregation Pirnciple)
      • 정의
          • 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
          • 하나의 일반적인 인터페이스보다는 여러개의 구체적인 인터페이스가 낫다.
          • 인터페이스의 단일책임

      5.DIP(의존성 역전의 원칙 : Dependency Inversion Principle)
    • 정의
        • 제어의 역전(IoC) : 
        • 의존 관계란?
        • 의존이란 has 관계를 말한다. A has a B , A depend on B 의 의미이다. ( aggregation , composition 이런것들이 의존이다. )
        • =>  하이 레벨 모듈은 로우레벨 모듈에 의존해서는 안된다. 둘다 추상에 의존해야 한다.
        • =>  하이 레벨 모듈,로우 레벨 모듈이란 단어가 사람을 헷갈리게 만든다.
        • =>  하이 레벨은 정책 모듈(객체), 로우 레벨 모듈은 세부 구현 모듈(객체)이라고 생각하면 된다.
        • =>  정책 모듈은 어떤것들이 들어오던지 간에 그 녀석에 맞게 처리할거야라는 룰만 가지고 있는 녀석이다.
        • =>  세부 구현 모듈은 실제 처리를 하는 녀석들을 말한다.
        • =>  추상은 상세를 의존해서는 안된다. 상세는 추상을 의존해야 한다.



결론!
OOP 와 OOD는 다른 개념이다.
OOP는 객체를 어떻게 만들껀지에 대한 이야기라면 OOD는 그 객체들의 관계를 어떻게 만들지 설계하는 방법이다.
그렇기 때문에 OOP를 잘 모르면 OOD도 이해하기 어렵다.
위에 포스팅한 내용들 흔한 이야기들이다. 지금 적으면서도 많이 부족하고 너무 추상적이 이야기들만 적었다는것을 필자는 안다.
나중에 하나씩 깨닫게 되면 하나씩 수정하겠다. SOLID는 결코 쉬운 개념이 아니다.