[TIL]단일 책임 원칙, 추상화

술술·2024년 3월 7일

TIL

목록 보기
5/21

단일 책임 원칙(SRP)

📌 객체 지향 프로그래밍이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다.

💭 어떤 클래스나 모듈은 변경하려는 단 하나 이유만을 가져야 한다


로버트 C. 마틴

  • 클래스를 변경하는 이유가 한 가지이기 위해서는 하나의 액터에 대한 책임만 가지고 있어야 합니다.

  • 여기서 책임은 하나의 특정 액터를 위한 기능 집합이고, 액터란 기능(=클래스 ,모듈)을 사용하는 주체입니다.

  • 객체가 담당하는 동작, 즉 책임이 많아질 수록 그 객체의 변경에 따른 영향도의 양과 범위가 매우 커지게 됩니다!

💻 하지만 SRP를 코드에 적용하면,

  • 책임 영역이 확실해져 한 책임의 변경에서 다른 책임의 변경의 연쇄작용에서 자유로울 수 있습니다. 즉, 코드의 의존성과 결합도를 줄입니다.

  • 단일 책임 원칙은 특정 객체의 책임 의존성 과중을 지양하기 위한 중요하고 기본적인 원칙입니다.

장점

  • 쉬운 테스트 - 책임이 하나인 클래스는 테스트 케이스가 줄어들기 때문에 테스트가 쉬워집니다.
  • 낮은 결합 - 단일 클래스의 기능이 적어져 종속성이 줄어든다.
  • 쉬운 검색 - 작고 잘 조직된 클래스는 모놀리식 클래스보다 검색하기 쉽습니다.
  • 구현하기 쉬움 - 하나의 책임만 가지고 있기 때문에 구현및 이해가 쉽습니다.



추상화

  • 복잡한 시스템을 간단한 개념으로 변환하는 프로세스
  • 관련성이 없는 세부 사항을 제거하고 중요한 특성만을 강조함으로써 달성

추상 클래스

  • 프로토콜과 클래스 상속을 통해 추상화를 구현할 수 있다.
  • 추상 클래스는 기본적인 행동을 정의하고, 그 행동을 어떻게 수행할지는 하위 클래스에게 맡기는 클래스

추상화를 사용해야 하는 이유

  • 코드의 간결성: 추상화를 통해 코드의 복잡성을 줄이고 이해를 쉽게 만들 수 있다.
  • 타입 안정성: 추상화는 타입 안정성을 제공하여 런타임 오류의 가능성을 줄인다.
  • 확장성: 추상 클래스를 사용하면 새로운 기능을 추가하기가 훨씬 쉽다. 기존 클래스를 수정하지 않고 새로운 클래스를 추가하거나 기존 클래스를 확장하는 방식으로 요구 사항을 쉽게 충족시킬 수 있다.
protocol Animal {
    func makeNoise()
}

class Dog: Animal {
    func makeNoise() {
        print("Woof!")
    }
}

class Cat: Animal {
    func makeNoise() {
        print("Meow!")
    }
}

let myDog: Animal = Dog()
let myCat: Animal = Cat()

myDog.makeNoise() // Woof!
myCat.makeNoise() // Meow!

Animal은 추상화 개념을 나타내며, Dog와 Cat은 Animal의 구체적인 형태. 이들은 Animal이 요구하는 makeNoise() 메소드를 구현


참고

단일 책임 원칙 https://yoongrammer.tistory.com/96

추상화 https://velog.io/@jaybadass/iOSSwift-클래스-추상화와-사용이유

profile
Hello

0개의 댓글