본문 바로가기
spring

객체지향

by kcj3054 2021. 10. 26.

유연하고, 변경에 좋다.

  • 컴퓨터를 부품 끼우는 것처럼 사용하는 것(다형성)

다형성

  • 세상을 역할(인터페이스)과 구현(인테페이스를 구현한 객체)로 구분

실세계에 비유

  • 자동차를 바꿔도 운전자에게 영향을 주지않는다. (자동차를 k3 -> 테슬라로 변경할때)
  • 운전자는 자동차의 역할, 자동차 인터페이스에대해서만 의존
  • 자동차역할만 구현하면 어떠한 자동차를 만들 수 있다 (역할과 구현을 구분, 새로운 자동차가 나와도 클라이언트를 변경할 필요가 없다)
  • 클라이언트는 대상의 인터페이스만 알면된다.
  • 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
  • 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.

객체는 협력이다.

  • 혼자 있는 개체는 없다,왜냐? 수많은 클라이언트가 서버가 서로 왔다갔다한다.

다형성의 본질

  • 인터페이스를 구현한 객체 인스턴스를 실행시점에 유연하게 변경할 수 있다.
  • 다형성은 협력이다, 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경가능..

SOLID

  • 좋은 객체 지향설계의 원칙

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

    • 한 클래스는 하나의 책임만 가져야한다.
    • 중요한 기준은 변경이다. 변경이 있을때 파급 효과가 적으면 단일 책임 원칙을 따른 것이다..
    • 변경이 있을때 하나의 지점에 하나만 고칠 수 있는 것
  • OCP 개방 - 폐쇄 원칙

    • 확장에는 열려 있으나 변경에는 닫혀있다
    • 자동차 다형성 예를 생각해보자 -> 자동차를 만들면 아반떼 , K3, ... 확장 할 수 있다 그러나 인터페이스 자체의 변경에는 닫혀있다.
    • 인터페이스를 구현한 새로운 클래스를 하나 만드는 것은 !! 기존 코드를 변경하는 것은 아니다(확장) !!,
    • 예를 들어보자
MemberRepository m = new MemoryMemberRepository(); // 기존 코드
MemberRepository m = new JdbcMemberRepository(); // 변경 코드
  • 구격 객체를 변경할려면 코드를 변경해야한다,,, 이렇게 되면 ocp를 지키지 않는 것이 아닌가? 이걸 위해서 스프링이 존재하는 것이다.

  • 스프링에서는 생성자로 MemberRepository를 주입만 받고 어떤 MemberRepository를 지정할 것인지 정하는 것은 AppConfig가 하는 것으로 해서 확장에서는 열여있으며 변경에는 닫혀있다~

  • LSP 리스코프 치환 원칙

    • 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야한다..
    • 자동차 인터페이스에서 엑셀은 앞으로 가라는 기능이있다, 근데 뒤로 가게 구현하면 그것은 LSP를 위반한 것이다.
  • ISP 인터페이스 분리 원칙(interface segregation principle)

    • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
    • 자동차 인터페이스를 -> 운전 인터페이스, 정비 인터페이스로 분리
    • 분리하면 정비 인터페이스가 변경이 일어나도 운전 인터페이스에는 영향을 주지 않느다..
    • 인터페이스는 명확해지고 대체 가능성이 높아진다..
  • DIP 의존관계 역전 원칙

    • 의존성 주입의 원칙에서는 -> 프로그래머는 추상화에 의존해야하고, 구체화에 의존하면 안된다가 있다..
    • 역할에 의존하게 해야한다는 것과 같다. 객체지향에서는 클라이언트는 인터페이스에 의존해야지 유연하게 구현체를 변경하면서 조립이 가능하기 때문이다.
    • ex :
    • MemberRepository m = new MemoryMemberRepository(); // 기존 코드 MemberRepository m = new JdbcMemberRepository(); // 변경 코드
    • 위의 코드를 다시보면 MemberRepository라는 인터페이스에도 의존하고 있고, MemoryMemberRepository라는 구현체에도 의존하고 있다. 이렇게 되면 인터페이스 의존하지만, 구현 클래스도 동시에 의존하고 있는 것이다.
    • DIP 위반.

결론

  • 다형성만으로는 OCP, DIP를 지킬 수없다.
  • 이런 것들을 위해서 spring이 존재한다...!

'spring' 카테고리의 다른 글

spring,... intellij 디버그  (2) 2021.11.30
DisplayName관련 오류  (0) 2021.10.27
srpingboot jpa domain 작성  (0) 2021.08.14
springboot, mysql연결  (0) 2021.08.14
스프링 h2-console 설정 에러와 해결..  (0) 2021.08.08