내일배움캠프 24일차

임클·2025년 4월 3일

내일배움캠프

목록 보기
25/44
post-thumbnail

하루하나 알고리즘

https://github.com/Yimkeul/AlgorithmSolution/tree/fd56d5b724a0fce305e56ceb6e944eeb867e5168/백준/Silver/30804. 과일 탕후루


1. Swift에서 프로토콜이란 무엇이며, 어떻게 활용하나요?

  • 프로토콜이란?
    Swift에서 프로토콜은 특정 기능이나 동작을 정의하는 청사진(blueprint)입니다. 클래스, 구조체, 열거형 등이 프로토콜을 채택(adopt)하여 해당 요구사항을 구현할 수 있습니다.
  • 활용 방법
    • 인터페이스처럼 사용: 타입이 가져야 할 메서드, 속성 등을 정의.
    • 다형성 구현: 서로 다른 타입이 동일한 프로토콜을 준수하면 공통적으로 동작 가능.
    • 예시:
      protocol Speakable {
          func speak()
      }
      
      struct Person: Speakable {
          func speak() {
              print("안녕하세요!")
          }
      }
      
      let person = Person()
      person.speak() // 출력: 안녕하세요!
      

2. 프로토콜의 요구사항은 무엇인가요?

프로토콜은 다음을 요구할 수 있습니다:

  • 속성(Properties): 이름, 타입, 읽기/쓰기 여부(get/set)를 지정. 구현은 채택한 타입에서 제공.
    protocol Identifiable {
        var id: String { get }
    }
    
  • 메서드(Methods): 메서드 이름, 매개변수, 반환 타입을 정의.
    protocol Movable {
        func move(to point: Int)
    }
    
  • 이니셜라이저(Initializers): 특정 초기화 방식을 강제.
    protocol Creatable {
        init(name: String)
    }
    
  • 연관 타입(Associated Types): 제네릭처럼 동작하며, 채택 타입에서 구체화.
    protocol Container {
        associatedtype Item
        func add(_ item: Item)
    }
    

3. 프로토콜 확장(Protocol Extension)을 사용하는 이유는 무엇인가요?

  • 기본 구현 제공: 프로토콜에 메서드나 속성의 기본 동작을 추가하여, 채택 타입이 필수로 구현하지 않아도 됨.
  • 코드 재사용성 증가: 공통 로직을 한 곳에서 정의하고 여러 타입에서 재사용.
  • 조건부 확장: where 절로 특정 조건을 만족하는 타입에만 확장 적용 가능.
  • 예시:
    protocol Printable {
        func printValue()
    }
    
    extension Printable {
        func printValue() {
            print("기본 출력")
        }
    }
    
    struct Number: Printable {}
    let num = Number()
    num.printValue() // 출력: 기본 출력
    

4. 프로토콜 지향 프로그래밍(Protocol-Oriented Programming)의 장점은 무엇인가요?

  • 유연성: 상속 대신 프로토콜 채택으로 다중 상속 문제 회피.
  • 재사용성: 작은 단위의 프로토콜을 조합해 복잡한 동작 정의 가능.
  • 값 타입 지원: 구조체와 열거형도 프로토콜을 채택 가능, 클래스에 국한되지 않음.
  • 테스트 용이성: 의존성 주입이 쉬워 단위 테스트 작성에 유리.
  • 예시:
    protocol Eatable {
        func eat()
    }
    
    protocol Flyable {
        func fly()
    }
    
    struct Bird: Eatable, Flyable {
        func eat() { print("먹는다") }
        func fly() { print("난다") }
    }
    
  • 결론: POP는 Swift의 값 타입과 조합되어 더 안전하고 모듈화된 코드를 작성할 수 있게 함.

0개의 댓글