기록/OOP
-
의존성 역전 원칙(Dependency Inversion Principle)기록/OOP 2023. 1. 31. 15:45
SOLID의 의존성 역전 원칙(Dependency inversion principle)은 소프트웨어 모듈을 느슨하게 결합하기 위한 방법론입니다. 의존성 역전 원칙에는 이렇게 기술되어 있습니다. (1) high-level 모듈은 low-level 모듈로부터 import하지 않아야 하며 abstraction에 의존해야 한다. 쉽게 말해서 high-level 모듈은 low-level 모듈의 존재조차 몰라야 한다. (2) Abstraction은 detail에 의존하지 않아야 한다. Detail(구체 클래스(타입) 등 구현부)이 abstraction에 의존해야 한다. 일반적으로 의존성 관계는 high-level의 정책 모듈에서 정책과 비즈니스 로직을 가지고 (종속되어) 구체적으로 구현되는 low-level로 흐릅..
-
인터페이스 분리 원칙(Interface Segregation Principle)기록/OOP 2023. 1. 31. 00:50
SOLID의 인터페이스 분리 원칙(Interface segregation principle)은 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않아야 함을 말합니다. 그러기 위해서는 큰 인터페이스를 분리해서 사용하는 기능만 제공하도록 설계해야 합니다. 사용하지 않지만, 의존성을 가지고 있다면 인터페이스가 변경되었을 때 사용하지도 않는데 수정이 필요합니다. 조금 더 나아가서, 모델이 비대할 때 모델과 뷰 사이에 뷰 모델과 뷰 모델이 채택하는 프로토콜을 두고 꼭 필요한 메서드와 정보만 제공하는 것도 예시가 될 수 있을 것 같습니다. 또한 iOS에서 실제로 잘 지켜진 사례는 UITableView 관련 프로토콜이 있습니다. 데이터와 셀을 제공하는 UITableViewDataSource와, 사용자와의 상호작용..
-
리스코프 치환 원칙(Liscov Substitution Principle)기록/OOP 2023. 1. 30. 12:49
SOLID의 리스코프 치환 원칙(Liscov substitution principle)은 자료형 S가 자료형 T의 서브 타입이라면 프로그램 속성의 변경 없이 자료형 T의 객체를 자료형 S의 객체로 치환할 수 있어야 함을 말합니다. 부모 클래스의 기능을 확장해서 사용하기 위해 상속하는 경우가 많은데, 무턱대고 상속하다가 자식 클래스가 부모 클래스가 정의해놓은 동작을 수행하지 못하거나, 뒤에서 나올 MeleeMinion의 speak() 메서드처럼 에러를 던지는 등, 퇴화한다면 상속이 제대로 되지 않고 있다는 의미입니다. 이런 상황에서 자료형 T의 객체를 자료형 S의 객체로 치환하게 되면, 올바르게 작업을 수행하지 않게 됩니다. 리스코프 치환 원칙은 상속 개념에 있어서 중요한 원칙이며, 상속할 때 리스코프 치..
-
개방-폐쇄 원칙(Open-Closed Principle)기록/OOP 2023. 1. 28. 21:32
SOLID의 개방-폐쇄 원칙(Open-closed principle)은 소프트웨어 객체는 확장에 대해 열려있어야 하고, 수정에 대해서는 닫혀있어야 함을 말합니다. 다음은 개방-폐쇄 원칙을 위배하는 코드입니다. class BallGame { let name: String init(_ name: String) { self.name = name } } func play(ballGame: BallGame) { switch ballGame.name { case "Soccer": print("11 vs 11") case "BaseBall": print("9 vs 9") default: fatalError("Not implemented.") } } let soccer = BallGame("Soccer") let ba..
-
단일 책임 원칙(Single Responsibility Principle)기록/OOP 2023. 1. 28. 15:31
SOLID의 단일 책임 원칙(Single responsibility principle)은 클래스나 모듈(이하 클래스로 통일해서 작성)은 하나의 책임만을 가지며, 그 책임을 완전히 캡슐화해야 함을 말합니다. 캡슐화란, 변수와 함수를 하나의 단위로 묶는 것을 말합니다. 이는 대체로 클래스를 통해 구현합니다. 다음의 Music struct를 가지고 재생하는 MusicPlayer class를 예시로 들어보겠습니다. struct Music { let name: String let artist: String let length: TimeInterval } 다음은 단일 책임 원칙을 위배한 코드입니다. class MusicPlayer { private var musics: [Music] private var curre..