-
인터페이스 분리 원칙(Interface Segregation Principle)기록/OOP 2023. 1. 31. 00:50
SOLID의 인터페이스 분리 원칙(Interface segregation principle)은 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않아야 함을 말합니다. 그러기 위해서는 큰 인터페이스를 분리해서 사용하는 기능만 제공하도록 설계해야 합니다. 사용하지 않지만, 의존성을 가지고 있다면 인터페이스가 변경되었을 때 사용하지도 않는데 수정이 필요합니다. 조금 더 나아가서, 모델이 비대할 때 모델과 뷰 사이에 뷰 모델과 뷰 모델이 채택하는 프로토콜을 두고 꼭 필요한 메서드와 정보만 제공하는 것도 예시가 될 수 있을 것 같습니다. 또한 iOS에서 실제로 잘 지켜진 사례는 UITableView 관련 프로토콜이 있습니다. 데이터와 셀을 제공하는 UITableViewDataSource와, 사용자와의 상호작용을 관리하는 UITableViewDelegate는 목적별로 잘 분리되어 있죠. 또한 Swift 표준 라이브러리의 값이 같은지 비교하기 위해 채택하는 Equatable이나, Equatable을 상속받은, 정수 해쉬값을 생성할 수 있는 Hashable 프로토콜도 인터페이스 분리 원칙을 준수하는 사례입니다.
하위 레벨의 모듈을 수정하더라도, 상위 레벨의 모듈에 영향을 끼치지 않기 위해(결합도를 줄이기 위해) 인터페이스를 두고 추상화를 도입합니다. 여기에서, 인터페이스를 세분화함으로써 시스템의 결합도를 더욱 줄일 수 있습니다. 따라서 유지보수 비용을 줄이기 위해서 지켜야 할 원칙입니다.
SOLID 원칙에 대해 작성한 이전 글들과 마찬가지로, Swift에서는 protocol을 사용하여 추상화를 도입할 수 있습니다. 널리 알려진 수륙양용(amphibious)을 예시로 들어보겠습니다.
// 수륙양용 protocol Amphibious: AnyObject { func drive() func turnLeft() func turnRight() func steer() func steerLeft() func steerRight() } class Tico: Amphibious { func drive() { // implement .. } func turnLeft() { // implement .. } func turnRight() { // implement .. } // 사용하지 않음 func steer() { } func steerLeft() { } func steerRight() { } }
티코 자동차는 운행과 관련해서 여러 가지 메서드를 사용할 수 있으니 일단 채택하고 구현했는데, 막상 사용하지 않는 메서드를 작성해줘야 하고, 여기에서 필요 없는 의존성을 가지게 됩니다. 따라서 아래와 같이 인터페이스를 목적별로 분리해서 필요한 메서드만 구현하여 사용하도록 만들어줄 수 있습니다.
protocol Car: AnyObject { func drive() func turnLeft() func turnRight() } protocol Boat: AnyObject { func steer() func steerLeft() func steerRight() } class Tico: Car { func drive() { // implement .. } func turnLeft() { // implement .. } func turnRight() { // implement .. } } // 수륙양용 장갑차 class AssaultAmphibiousVehicle: Car, Boat { ... }
'기록 > OOP' 카테고리의 다른 글
의존성 역전 원칙(Dependency Inversion Principle) (0) 2023.01.31 리스코프 치환 원칙(Liscov Substitution Principle) (1) 2023.01.30 개방-폐쇄 원칙(Open-Closed Principle) (0) 2023.01.28 단일 책임 원칙(Single Responsibility Principle) (0) 2023.01.28