연산자 커스터마이징

BS_Lee·2025년 7월 13일

swift

목록 보기
16/21

Swift 연산자 오버로딩과 사용자 정의 연산자 정리

Swift에서는 기본 제공되는 연산자뿐만 아니라 연산자를 직접 정의하거나 옵셔널 타입에도 오버로딩을 통해 다양한 동작을 지정할 수 있다. 오늘은 아래와 같은 내용을 중심으로 Swift의 연산자 활용법을 정리해본다

  • 옵셔널 문자열을 더하는 + 연산자
  • 사용자 정의 전위/후위 연산자
  • 커스텀 타입(Person, Family) 간의 연산자 정의

옵셔널 문자열에 대한 + 연산자 오버로딩

func + (
    lhs: String?,
    rhs: String?
) -> String? {
    switch(lhs, rhs) {
    case(.none, .none):
        return nil
    case let (.some(value), .none),
         let (.none, .some(value)):
        return value
    case let (.some(lhs), .some(rhs)):
        return lhs + rhs
    }
}

개념 설명

  • 옵셔널 String 타입도 + 연산을 사용할 수 있도록 오버로딩 함.
  • 두 값 모두 nil이면 결과도 nil.
  • 한 쪽이 nil이면, 다른 쪽 값을 반환.
  • 둘 다 값이 있으면 일반 문자열처럼 이어붙임.
let firstName: String? = "Foo"
let lastName: String? = " Bar"
let fullName = firstName + lastName  // "Foo Bar"

사용자 정의 연산자

전위 연산자 (prefix)

prefix operator ^
prefix func ^ (value: String) -> String {
    value.uppercased()
}
let lowercaseName = "Foo Bar"
let uppercaseName = ^lowercaseName  // "FOO BAR"
  • ^"hello""HELLO"
  • 문자열을 전부 대문자로 바꾸는 사용자 정의 연산자

후위 연산자 (postfix)

postfix operator *
postfix func * (value: String) -> String {
    "*** \(value) ***"
}
let widthStars = lowercaseName*  // "*** Foo Bar ***"
  • "hello"*"*** hello ***"
  • 문자열 양옆에 별표를 붙이는 연산자

커스텀 타입 간의 연산자 정의

struct Person {
    let name: String
}
struct Family {
    let members: [Person]
}

🔹 Person + Person → Family

func + (lhs: Person, rhs: Person) -> Family {
    Family(members: [lhs, rhs])
}

🔹 Family + Person → Family

func + (lhs: Family, rhs: Person) -> Family {
    var members = lhs.members
    members.append(rhs)
    return Family(members: members)
}

🔹 Family + [Person] → Family

func + (lhs: Family, rhs: [Person]) -> Family {
    var members = lhs.members
    members.append(contentsOf: rhs)
    return Family(members: members)
}

사용 예

let mom = Person(name: "Mom")
let dad = Person(name: "Dad")
let son = Person(name: "Son")
let daughter1 = Person(name: "Daughter1")
let daughter2 = Person(name: "Daughter2")

let family = mom + dad                         // Family with mom and dad
let familyWithChildren = family + son         // Family with mom, dad, son
let familyWithDaughters = familyWithChildren + [daughter1, daughter2]
  • 연산자 오버로딩을 통해 자연어처럼 family + son 또는 mom + dad 형태로 코드를 구성할 수 있어 가독성이 높아짐.

오늘의 핵심 요약

개념설명
옵셔널 + 오버로딩nil 처리까지 고려한 안전한 문자열 결합 방식 제공
전위/후위 연산자개발자가 의도한 방식으로 표현력 있는 코드 구성 가능
커스텀 타입 연산자 오버로딩연산자 문법을 활용해 DSL처럼 표현 가능함

마무리

Swift에서는 연산자 오버로딩과 사용자 정의 연산자 기능을 통해 표현력 있는 코드, 안전한 로직 처리, 가독성 좋은 DSL 형태의 인터페이스를 만들 수 있다. 단, 과한 오버로딩은 오히려 가독성을 해칠 수 있으므로 적절한 수준에서 명확한 의미를 갖도록 정의하는 것이 중요하다.

0개의 댓글