코코아 Study_SOLID#5

VANS·2021년 12월 20일
0

스터디

목록 보기
5/15

21.12.20(월)


SOLID : 객체 지향 설계 5대 원칙

  • SOLID를 잘 녹여낸 소프트웨어는 이해하기 쉽우며, 리팩토링과 유지보수가 수월하고 논리정연하다.

    S : SRP(Single Responsibility Principle) : 단일 책임 원칙
    O : OCP(Open CLosed Principle) : 개방 폐쇄 원칙
    L : LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
    I : ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
    D : DIP(Dependency Incersion Principle) : 의존 역전 원칙


1. SRP - 단일 책임 원칙

클래스와 메소드는 하나의 역할만 하도록 한다.

  • 현재 남자 클래스는 남자친구, 아들, 사원, 소대원 4가지 역할과 책임이 너무 많아 피곤하다.
  • 이런 경우 4명중 대상이 하나 사라진다면 해당 역할(책임)의 대상이 없어져 남자가 힘들어진다.

  • 위와 같이 역할(책임)에 따라 분리하게되면 대상과 함께 없어질 수 있으므로 남자가 덜 힘들다.
  • 대상에 따라 역할(책임)을 분리하는것을 '단일 책임 원칙'이라 한다.

2. OCP - 개방 폐쇄 원칙

자신의 확장에는 개방돼 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.


  • 운전자는 마티즈와 쏘나타의 변화에 따라 행동(수동 -> 자동)을 의존하여 변하게 된다.

  • 운전자의 행동에 영향받지 않도록 하기 위해 마티즈와 쏘나타의 상위클래스 자동차를 둔다.
  • 자동차 클래스는 하위에 마티즈와 쏘나타 차종을 상속하여 확장할 수 있고, 운전자의 행동에는 영향 X

3. LSP - 리스코프 치환 원칙

서브타입은 언제나 자신의 상위 타입으로 교체할 수 있어야 한다.

  • 객체지향에서의 상속은 조직도, 계층도가 아니라 위 사진처럼 분류도가 되어야 한다.

    객체 지향의 상속은 상위 클래스의 특성을 재사용하는 것이다.
    객체 지향의 상속은 상위 클래스의 특성을 확장하는것이다.
    객체 지향의 상속은 is a kind of 관계를 만족해야 한다.
    상속관계 표현 : kind of
    포유류 is a kind of 동물 : 포유류는 동물의 한 분류이다.
    고래 is a kind of 포유류 : 고래는 포유류의 한 분류이다.
    *구현 클래스 is able to 인터페이스 : 구현 분류는 '인터페이스' 할 수 있어야 한다.(able)

  • 위와 같은 형태를 LSP 위반 사례로 볼 수 있다.(분류도 X -> 딸이 할아버지 역할을 할 수 있다.)
  • 위와 같은 형태를 LSP를 구현한 사례로 볼 수 있다.(분류도 O -> 고래는 동물의 역할을 할 수 있다.)

4. ISP - 인터페이스 분리 원칙

클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 된다.


  • 단일 책임 원칙을 적용하여 각 클래스별로 역할(책임)을 부여했을때는 다수의 클래스가 생성이 된다.

남자친구 홍길동 = new 남자();
아들 홍길동 = new 남자();
사원 홍길동 = new 남자();
소대원 홍길동 = new 남자();
  • 하나의 클래스에 다양한 역할에 따라 인터페이스를 만들어 클래스 수를 줄일 수 있다.

  • 상위클래스(사람)가 풍성할 수록 형변환(Casting)이 적게 일어나기 때문에 소스코드가 간결해진다.

5. DIP - 의존 역전 원칙

자신보다 변하기 쉬운 것에 의존하지 마라

  • 자동차는 스노우타이어에 의존한다.

  • 기존 의존 관계를 타이어 인터페이스를 사용하여 역전시켰다
    (보다 '구체적인 스노우타이어'에 의존하던 방향을 '추상적인 타이어'에 의존하는 방향으로 역전시킴)

// 기존 코드(자동차는 스노우타이어에 의존한다.)
class Car {
    SnowTire tire = new SnowTire();
}

// DIP 적용
class Car {
    Tire tire;

    void setTire(Tire tire) {
        this.tire = tire;
    }
}
  • 상위클래스, 인터페이스, 추상클래스일 수록 변하지 않을 가능성이 크다.
  • 하위클래스나 구체적인 클래스가 아닌 더 추상적인것에 의존하라는 것의 DIP(의존 역전 원칙)이다.
profile
코딩도 점진적 과부화

0개의 댓글