객체지향 설계

IT 위키
Object Oriented Designing; Object Oriented Architecting

1 5원칙

줄여서 SOLID라고 부른다.

1.1 단일 책임 원칙

Single Responsiblity Principle; SRP
  • 소프트웨어의 컴포넌트는 단 하나의 책임만을 가져야 한다.

1.1.1 예시

AS-IS
  • 복합기 Class
    • copy()
    • scan()
TO-BE
  • 복사기 Class { copy() }
  • 스캐너 Class { scan() }

1.2 개방 폐쇄 원칙

Open Close Principles; OCP
  • 확장에 대해선 열려 있어야 하고 수정에 대해선 닫겨 있어야 한다.
  • 기존의 코드를 변경하지 않고(Closed) 기능을 수정하거나 추가할 수 있도록(Open) 해야 한다.

1.2.1 예시

  • Class Car { drive() }
  • 확장은 허용(O): Class SUV() extends Car
    • override drive();
    • new method stop();
  • 변경엔 폐쇄(X): Class Plane extends Car
    • change drive() to fly();

1.3 리츠코프 치환 원칙

Liskov Substitution Principle; LSP
  • 자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다.

1.3.1 예시

  • Class SUV extends Class CAR { run() }
  • SUV suv = new SUV();
  • CAR car = (CAR)suv;
  • car.run();

1.4 인터페이스 분리의 원칙

Interface Segregation Principle; ISP
  • 자신이 사용하지 않는 메서드는 구현하지 않도록 해야 한다.
    • 이런 경우 인터페이스는 쪼개져야 한다.
  • 하나의 일반적인 인터페이스 보단 여러 개의 구체적인 인터페이스가 낫다.

1.4.1 예시

AS-IS
  • Interface 이동체
    • drive();
    • fly();
    • sail();
    • stop();
TO-BE
  • Interface 자동차 { drive(); stop(); }
  • Interface 비행기 { fly(); stop(); }
  • Interface 배 { sail(); stop(); }

1.5 의존관계 역전의 원칙

Dependency Inversion Principle; DIP
  • 의존 관계를 맺을 때, 변화하기 쉬운것 보단 변화하기 어려운 것에 의존해야 한다.
  • 고차원의 모듈은 저차원의 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존 해야 한다.
  • DIP를 만족한다는 것은 의존관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는다는 것을 의미

1.5.1 예시

아래와 같이 하면 Car 클래스는 '겨울 타이어'라는 하위 클래스에 의존성을 가지게 된다. (의존성 역전)
  • Class Car {
    • WinterTire wt = new WinterTire();
    • setTireModel(String model) {
      • wt.model = model;
    • }
  • }
아래와 같이 하면 타이어에 대한 의존성이 줄어든다.
  • Class Car {
    • Tire wt = null;
    • setTire(Tire t) {
      • wt = t;
    • }
  • }