인터페이스 분리 법칙 이해하기

권승용(Eric)·2024년 11월 12일

TIL

목록 보기
9/38

인터페이스란?

  • 인터페이스 분리 법칙에서의 인터페이스란 무엇일까?
  • 이는 Java 언어의 인터페이스를 뜻하고, Swift에서는 프로토콜이 그 역할을 수행하고 있다.
  • 따라서 인터페이스 분리 법칙이란, Swift에서는 프로토콜 분리 법칙이다.

프로토콜을 왜 분리할까?

  • 우리는 프로토콜을 사용해 객체의 프로퍼티 / 메소드를 추상화하고, 코드가 다형성을 지원하도록 구현한다.
  • 그런데 하나의 거대한 프로토콜에 모든 프로퍼티 / 메소드를 넣으면, 해당 프로퍼티 / 메소드 중 일부분만 필요한 객체 또한 필요없는 프로퍼티 / 메소드를 구현해야 한다.
  • 따라서 프로토콜을 작고 집중된 단위로 분리해, 필요한 요구사항만을 객체가 구현할 수 있도록 하는 것이 프로토콜 분리 법칙, 즉 인터페이스 분리 법칙이다.
  • 아래 프린터 예제를 살펴보자.
// 1. 먼저 모든 기능을 포함하는 Printer 인터페이스를 정의.
protocol MultiFunctionPrinter {
    func printDocument()
    func scanDocument()
    func copyDocument()
}

// 2. 기본 프린터는 단순히 인쇄만 할 수 있음. 그러나 MultiFunctionPrinter 프로토콜을 준수하려면 스캔과 복사 기능도 구현해야 함.
// 이는 ISP를 위반하는 예시.
class BasicPrinter: MultiFunctionPrinter {
    func printDocument() {
        print("Printing document...")
    }
    
    // BasicPrinter는 스캔과 복사 기능이 필요하지 않으므로 빈 메서드로 구현하게 됨.
    // 이는 사용하지 않는 메서드를 구현해야 하므로 ISP를 위반.
    func scanDocument() {
        // 불필요한 구현
    }
    
    func copyDocument() {
        // 불필요한 구현
    }
}

// 3. ISP를 준수하여 각 기능별로 인터페이스를 분리.
protocol Printer {
    func printDocument()
}

protocol Scanner {
    func scanDocument()
}

protocol Copier {
    func copyDocument()
}

// 4. 이제 BasicPrinter는 단순히 Printer 프로토콜만 채택하여 필요한 기능만 구현할 수 있음.
class BasicPrinterISP: Printer {
    func printDocument() {
        print("Printing document...")
    }
}

// 5. 복합 기능을 갖춘 AllInOnePrinter는 모든 기능을 제공하므로, 세 가지 프로토콜을 모두 채택할 수 있음.
class AllInOnePrinter: Printer, Scanner, Copier {
    func printDocument() {
        print("Printing document...")
    }
    
    func scanDocument() {
        print("Scanning document...")
    }
    
    func copyDocument() {
        print("Copying document...")
    }
}
  • 이번 공부로 인터페이스 분리 법칙에 관해 더욱 깊숙히 이해할 수 있었다.
profile
ios 개발자에용

0개의 댓글