YJ의 새벽

Spring ( 객체지향 설계 5가지 원칙 ( (SOLID)) 본문

Spring/Spring

Spring ( 객체지향 설계 5가지 원칙 ( (SOLID))

YJDawn 2023. 2. 26. 14:53

 

 

 

-- 객체지향의 핵심은 다형성.

-- 다형성만으로 쉽게 부품을 갈아 끼우듯 개발할 수 없다.

-- 다형성만으로 구현 객체를 변경할 때 클라이언트 코드도 함께 변경된다.

-- 다형성만으로는 OCP, DIP 를 지킬수 없다.

 

 

 

 

  • SOLID  

-- SRP  :  단일 책임 원칙  ( Single Responsibility Principle )

-- OCP  :  개방-폐쇠 원칙  ( Open / Closed Principle )

-- LSP  :  리스코프 치환 원칙  ( Liskov Substitution Principle )

-- ISP  :  인터페이스 분리 원칙  ( Interface Segregation Principle )

-- DIP  :  의존관계 역전 원칙  ( Dependency Inversion Principle )

 

 

 

 

 

 

 

SPR  단일 책임원칙 

-- 한 클래스는 하나의 책임만 가져야한다.

-- 하나의 책임이라는 것은 모호하다. ( 클수도 , 작을수도있음 ) 

    - 한 클래스가 수행할수 있는 기능(책임) 이 여러개라면 , 

      클래스 내부 함수끼리 결합이 발생할 가능성이 높아진다.

-- 중요한 기준은 변경 이다.

    ( 변경이 있을때 파급 효과가 적으면 단일책임원칙을 잘 따른것.

 

 

 

 

OCP  개방-폐쇠 원칙

-- 소프트웨어 요소는 확장에는 열려있으나, 변경에는 닫혀있어야 한다.

   - 즉 , 기존의 코드를 변경하지않고 기능을 수정하거나 추가할수 있도록 설계하여야한다. 

-- 다형성.

-- 인터페이스를 구현한 새로운 클래스를 하나만들어,

   새로운 기능을 구현 .

       OCP 문제점

-- 구현객체를 변경하려면 클라이언트 코드를 변경해야한다.

    ex  )  MemberRepository m = new MemoryMemberRepository() ;    // 기존코드

             MemberRepository m = new JdbcMemberRepository() ;      // 변경코드

-- 다형성을 사용했지만 . OCP 원칙을 지킬수없다.

-- 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다. 

     ( Spring Container )

 

 

 

 

 

LSP  리스코프 치환 원칙

-- 객체는 정확성을 깨드리지 않으면서 하위타입의 인스턴스로 바꿀수 있어야한다. 

   - 즉, 하위타입 객체는 상위타입 객체에서 가능한 행위를 수행할수 있어야한다.

        상위타입을 하위타입객체로 치환해도 정상적으로 동장해야한다. 

    ex  ))  자동차인터페이스는 엑셀은 앞으로 가는기능,

              뒤로 가게 구현하면 LSP 위반 , 느리더라도 앞으로 가야함.

 

 

 

 

 

ISP  인터페이스 분리 원칙

-- 한클래스는 자신이 사용하지 않는 인터페이스는 구현하지않아야한다.

   - 클라이언트는 자신이 사용하는 메서드에만 의존해야한다. 

   - 클라이언트가 사용하지않는 인터페이스에 변경이 발생하여도 영향을 받지않도록 만들어야한다.

-- 특정클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

-- 자동차 인터페이스 --> 운전 , 정비 로 분리

   사용자 인터페이스 --> 운전자, 정비사 로 분리

-- 인터페이스가 명확해지고, 대체 가능성이 높아진다.

 

 

 

 

 

DIP 의존관계 역전 원칙

-- 추상화에 의존해야지, 구체화에 의존하면 안된다.

     - 변하기 어려운것 ( 추상적인것 ) 에 의존해야지,

       변하기 쉬운것  ( 구체적인것 ) 에 의존하면 안된다.

-- 구현클래스에 의존하지말고, 인터페이스에 의존하라는 뜻.

 

 

 

 

 

'Spring > Spring' 카테고리의 다른 글

Spring 3 ( 파라미터 가져오기 , 화면전환 )  (0) 2023.04.21
Spring 2 ( 개발환경 ( STS ))  (0) 2023.04.21
Spring 1 ( 개요 )  (0) 2023.04.21
SpringBoot 개념정리?  (0) 2023.03.09
Spring.  (0) 2023.02.13
Comments