🔥 자동 생성된 구현 사용하기

461자
6분

Swift에서는 Equatable, Hashable, Comparable 프로토콜에 대해 간단한 경우에 자동으로 프로토콜 준수를 제공합니다. 이렇게 자동 생성된 구현을 사용하면 프로토콜 요구사항을 직접 구현하기 위해 반복적인 상용구 코드를 작성할 필요가 없습니다.

Equatable 프로토콜의 자동 생성된 구현

Swift는 다음과 같은 종류의 사용자 정의 타입에 대해 Equatable의 자동 생성된 구현을 제공합니다:

  • Equatable 프로토콜을 준수하는 저장 속성만 가지는 구조체
  • Equatable 프로토콜을 준수하는 연관 타입만 가지는 열거형
  • 연관 타입이 없는 열거형

==의 자동 생성된 구현을 받으려면, == 연산자를 직접 구현하지 않고 원래 선언이 포함된 파일에서 Equatable 준수를 선언하면 됩니다. Equatable 프로토콜은 !=에 대한 기본 구현을 제공합니다.

아래 예제는 Vector2D 구조체와 유사한 3차원 위치 벡터 (x, y, z)에 대한 Vector3D 구조체를 정의합니다. x, y, z 속성은 모두 Equatable 타입이므로, Vector3D는 동등 연산자의 자동 생성된 구현을 받습니다.

struct Vector3D: Equatable {
    var x = 0.0, y = 0.0, z = 0.0
}
 
let twoThreeFour = Vector3D(x: 2.0, y: 3.0, z: 4.0)
let anotherTwoThreeFour = Vector3D(x: 2.0, y: 3.0, z: 4.0)
if twoThreeFour == anotherTwoThreeFour {
    print("이 두 벡터도 동등합니다.")
}
// "이 두 벡터도 동등합니다."가 출력됩니다.
swift

Hashable 프로토콜의 자동 생성된 구현

Swift는 다음과 같은 종류의 사용자 정의 타입에 대해 Hashable의 자동 생성된 구현을 제공합니다:

  • Hashable 프로토콜을 준수하는 저장 속성만 가지는 구조체
  • Hashable 프로토콜을 준수하는 연관 타입만 가지는 열거형
  • 연관 타입이 없는 열거형

hash(into:) 메서드를 직접 구현하지 않고 원래 선언이 포함된 파일에서 Hashable 준수를 선언하면 hash(into:)의 자동 생성된 구현을 받을 수 있습니다.

Comparable 프로토콜의 자동 생성된 구현

Swift는 원시값이 없는 열거형에 대해 Comparable의 자동 생성된 구현을 제공합니다. 열거형에 연관 타입이 있다면, 그 연관 타입은 모두 Comparable 프로토콜을 준수해야 합니다. < 연산자를 직접 구현하지 않고 원래 열거형 선언이 포함된 파일에서 Comparable 준수를 선언하면 <의 자동 생성된 구현을 받을 수 있습니다. Comparable 프로토콜의 <=, >, >=에 대한 기본 구현은 나머지 비교 연산자를 제공합니다.

아래 예제는 초보자, 중급자, 전문가에 대한 케이스를 가지는 SkillLevel 열거형을 정의합니다. 전문가는 추가로 보유한 별의 수로 등급이 매겨집니다.

enum SkillLevel: Comparable {
    case beginner
    case intermediate
    case expert(stars: Int)
}
 
var levels = [SkillLevel.intermediate, SkillLevel.beginner,
              SkillLevel.expert(stars: 5), SkillLevel.expert(stars: 3)]
 
for level in levels.sorted() {
    print(level)
}
// "beginner" 출력
// "intermediate" 출력
// "expert(stars: 3)" 출력
// "expert(stars: 5)" 출력
swift

위 코드에서는 SkillLevel 열거형이 Comparable 프로토콜을 채택하고 있습니다. 이를 통해 Swift 컴파일러는 < 연산자의 구현을 자동으로 제공하며, 열거형의 케이스들을 알파벳 순서로 비교할 수 있게 됩니다.

levels 배열에는 다양한 SkillLevel 값들이 저장되어 있습니다. 그리고 sorted() 메서드를 호출하여 levels 배열을 정렬하고 있는데, 이때 Comparable 프로토콜의 구현 덕분에 정렬이 가능해집니다.

for 반복문을 사용하여 정렬된 levels 배열의 각 요소를 차례로 출력하면, 아래와 같이 SkillLevel 값들이 순서대로 나타나는 것을 확인할 수 있습니다.

beginner
intermediate
expert(stars: 3)
expert(stars: 5)
text

이처럼 Swift는 간단한 경우에 자주 사용되는 프로토콜들에 대해 자동으로 구현을 제공함으로써, 보일러플레이트 코드를 줄이고 코드의 가독성과 생산성을 높여줍니다. 프로토콜의 요구사항을 직접 구현하는 대신 자동 생성된 구현을 사용할 수 있어 편리합니다.