Post

Swift 추상화와 프로토콜(인터페이스)

Swift 추상화와 프로토콜(인터페이스)

1. 추상화란?

추상화(Abstraction)는 복잡한 시스템에서 핵심 개념만 노출하고, 내부 구현은 숨기는 객체지향 설계 원칙이다.

  • 무엇을 할 수 있는지 정의
  • 어떻게 하는지는 숨김

Swift에서는 Protocol이 Java의 인터페이스 역할을 하며, 추상화를 실현하는 핵심 도구다.


2. Swift에서의 인터페이스 = Protocol

Swift에는 Java처럼 interface 키워드가 없다. 대신 **protocol**이 동일한 개념을 제공한다.

예시: 기능만 정의

1
2
3
protocol Drivable {
    func drive()
}

이 프로토콜을 채택하면 drive() 메서드를 반드시 구현해야 한다.

1
2
3
4
5
class Car: Drivable {
    func drive() {
        print("차가 달립니다.")
    }
}

3. 프로토콜의 특징

항목내용
다중 채택여러 개의 프로토콜을 동시에 채택 가능
구현 강제프로토콜의 요구사항은 필수로 구현해야 함
타입 추상화프로토콜을 타입으로 사용 가능 (some, any)
확장extension으로 기본 구현 제공 가능 (Java 8 default 메서드와 유사)

4. 프로토콜을 활용한 추상화 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
protocol Payable {
    func pay(amount: Int)
}

class KakaoPay: Payable {
    func pay(amount: Int) {
        print("카카오페이로 \(amount)원 결제")
    }
}

class ApplePay: Payable {
    func pay(amount: Int) {
        print("애플페이로 \(amount)원 결제")
    }
}

func processPayment(method: Payable) {
    method.pay(amount: 10000)
}

Payable 프로토콜을 통해 KakaoPay, ApplePay 객체를 추상화하여 공통된 인터페이스로 처리할 수 있다.


5. 프로토콜 타입과 추상화

  • func process(method: Payable)추상화된 타입
  • 다양한 실제 객체를 하나의 형태로 처리 가능
  • 런타임에 실제 객체가 어떤 클래스인지 몰라도 문제없이 동작

6. 프로토콜 + Extension = 유연한 기본 구현

1
2
3
4
5
6
7
8
9
protocol Loggable {
    func log()
}

extension Loggable {
    func log() {
        print("기본 로그 처리")
    }
}

→ 기본 구현을 제공해 선택적 구현이 가능하다. Java의 default 메서드 개념과 유사.


7. 프로토콜과 클래스/구조체/열거형

Swift의 거의 모든 타입은 프로토콜을 채택할 수 있다.

  • 클래스, 구조체, 열거형 모두 사용 가능
  • 상속 대신 프로토콜 중심 설계가 권장됨

8. 결론

  • Swift에서 추상화는 프로토콜을 통해 구현된다.
  • 클래스 상속보다 프로토콜 중심 설계가 더 유연하고 강력하다.
  • 다형성, 테스트 용이성, 결합도 낮추기에 유리하다.
This post is licensed under CC BY 4.0 by the author.