TIL - 2022.11.21

자라나는 ㅇㅅㅇ개발자·2022년 11월 21일
0

TIL

목록 보기
16/126

객체지향 프로그래밍 실시간 강의 3일차

2주차 복습 - 객체지향 설계의 핵심

  • 프로그램을 유연하고 변경이 쉽게 만들어야한다.
  • 각 객체들은 역할과 책임이 주어진다.
  • 각 객체들은 서로 협력을 통해 움직인다.
  • 이러한 역할과 책임을 가지는 객체들이 서로 협력을 통해 시스템을 구성한다.
  • 객체의 품질이 협력의 품질을 결정한다.

SOLID 원칙

  • 의사소통에 대한 비용을 크게 줄여준다.
  • 변경에 유연하게 대응하기 위해
  • 어떠한 상황에서 어떤 원칙이 사용되는지를 목적으로 사용하는 것이 중요!

SRP - 단일 책임 원칙

  • 하나의 클래스는 하나의 책임만 가져야 한다.
  • 하나의 책임의 기준은 변경이다.
    변경이 발생했을 때, 변경해야될 부분이 적으면 단일 책임 원칙을 준수한 것.
    클래스를 변경해야 하는 이유가 오직 하나여야 한다.
  • 예시 : Phone 이라는 클래스에서 멤버변수인 serialNumber는 고유정보이므로 변화 요소가 아니지만, cpu, memory, battery, weight 등 변화가 생길 수 있으면 부담이 발생한다.
class GalaxySpec {
  private String cpu;
  private String memory;
  private int battery;
  private double weight;
}

class Galaxy {
   private String serialNumber;
	 private GalaxySpec spec;
   public Galaxy(String serialNumber, GalaxySpec spec) {
      this.serialNumber = serialNumber;
      this.spec = spec;
   }
}

스펙만 관리하도록 객체를 나눔

OCP - 개방/폐쇄 원칙

  • 확장에는 열려있으나 변경에는 닫혀있어야한다.
  • 확장에 대한 비용은 극대화하고, 변경을 위한 비용은 줄여야한다.
  • 공통화를 하여 변경해야 하는 부분을 최소화 하자는 것이 주 목적
class Phone {
   private String serialNumber;
	 private PhoneSpec spec;
   public Phone(String serialNumber, PhoneSpec spec) {
      this.serialNumber = serialNumber;
      this.spec = spec;
   }
}

class PhoneSpec {
  private String cpu;
  private String memory;
  private int battery;
  private double weight;
}

class Galaxy extends Phone

class IPhone extends Phone

class 샤오미 extends Phone

class Sony extends Phone

상속을 통해 변경은 없이 확장만 수행

  • 템플릿 메소드 패턴 : 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의 하는 패턴이다. 알고리즘이 단계별로 나누어 지거나, 같은 역할을 하는 메소드이지만 여러곳에서 다른형태로 사용이 필요한 경우 유용한 패턴이다. - GoF Design Patterns

LSP - 리스코프 치환 원칙

  • 하위타입은 언제나 자신의 상위 타입으로 교체할 수 있어야 한다.(상속의 개념)
  • 정확성을 깨트리면 안된다.(빌런이 없으면된다...)
    스피커(부모 클래스) 기능 중 볼륨 업은 소리를 키우는 기능이다. 하만카돈 스피커(자식 클래스)의 볼륨업은 소리를 줄이면 안된다. 소리가 작게 커지더라도 소리를 키워야한다. → 그래야 믿고 쓸 수 있다.

ISP - 인터페이스 분리 원칙

  • 책임을 나눠서 필요한 메소드만 사용할 수 있게 하자
  • 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.
  • 특정 클라이언트를 위하여, 하나의 범용 인터페이스를 제공하는 것 보다, 여러 개의 인터페이스를 제공하는 것이 낫다.
public class SkyPhone implements Phone {
    @Override
    public void call(String phoneNumber) {
         // ..
    }

    @Override
    public void pay(String cardName) {
        // ..
    }

		@Override
    public void wirelessCharge() {
         // 1. 가만히 냅눈다. - 극강 빌런
         // 2. System.out.println("사용하지 않음"); - 그나마 양호
         // 3. throw new NotSupporedException(); - 테스트코드에서 걸리는 케이스
    }
}

DIP - 의존관계 역전 원칙

  • 객체들 간의 협력 과정에서 의존 관계가 형성되는데, 이 때 어떻게 하면 변화에 용이하게 대응할 수 있을 것인가에 대한 가이드 라인.
  • 변하기 쉬운 것과 어려운 것을 구분해야 한다.
    변하기 쉬운 것 -> 구체적인 행동
    변하기 어려운 것 -> 흐름이나 개념과 같은 추상적인 것

0개의 댓글