티스토리 뷰

언어 소개 - Swift

Swift - 사용자 정의 연산자

최초의 펭귄 2018. 5. 21. 18:00

안녕하세요. 오늘은 Swift의 사용자 정의 연산자 부분에 대해 알아보려고 합니다.
Swift는 사용자가 원하는 동작을 하는 연산자를 생성할 수 있습니다.
그렇기에 Swift에서 연산자는 부호로 표현하는 함수라고 할 수 있습니다.

연산자의 종류

연산자를 만들기 전에 Swift의 연산자 종류를 먼저 알아 보겠습니다.
Swift의 연산자는 총 3 종류로 전위, 중위, 후위로 구성됩니다.

  1. 전위 연산자
    연산자가 피연산자 앞에 위치하는 연산자입니다.

    // 대표적인 예) 논리 부정 연산자
    a = !a
    
  2. 중위 연산자
    연산자가 두 피연산자 사이에 위치하는 연산자입니다.

    // 대표적인 예) 기본적인 연산자들
    a + b
    a += b
    a - b
    
  3. 후위 연산자
    연산자가 피연산자 뒤에 위치하는 연산자입니다.

    // 대표적인 예) 옵셔널 관련 연산자
    a?
    a!
    

연산자를 만들기 전에!

연산자는 /, =, -, +, _, %, <, >, &, |, ^, ?, ~ 를 결합하여 만들 수 있습니다.
마침표(.)을 이용하여 사용자를 만들수 있지만 연산자 문자 중 맨 처음 문자가 마침표여야 합니다.
.+.는 사용 가능하지만 +.+와 같이 선언하면 +와 .+연산자 로 나누어 인식하게 됩니다.
물음표와 느낌표는 연산자에 포함 가능하지만 자체적으로 재정의는 불가능합니다!
토큰 =. ->, //, /_, */전위 연산자 <, &, ? 중위 연산자 ? 후위 연산자 >, !, ? 역시 재정의가 불가능합니다.

전위 연산자

전위 연산자를 구현하기 위해 prefix라는 키워드를 사용합니다.

// 연산자를 구현하기 위해 미리 선언합니다.
prefix operator **

// 제곱을 수행하는 연산자를 정의합니다.
prefix func ** (num: Int) -> Int{
    return num * num
}
print(**100)
// 10000

위의 연산자를 재정의 하지 않고 기능만 추가하려면 연산자를 선언하지 말고 함수를 overload하면 됩니다.

//논리 부정 연산자를 String에서도 사용 가능하도록 기능을 추가합니다.
prefix func ! (str: String) -> Bool{
    return str.isEmpty()
}
// !을 통해 String의 값이 비었는지 확인 가능합니다.
print(!"")
// true

후위 연산자

후위 연산자를 구현하기 위해 postfix라는 키워드를 사용합니다.

postfix operator ++
// 전위와 같이 연산자를 구현하기 위해 미리 선언합니다.

// 값에 1을 더하는 연산자를 만듭니다.
postfix func ++ (num: Int) -> Int{
    return num + 1
}
print(1++)
// 2

하나의 피연산자에 전위와 후위를 한 줄에 사용하게 되면 후위가 먼저 실행됩니다.

print(**10++)
// (11) * (11)
// 121

중위 연산자

중위 연산자의 종류는 다양합니다. 그렇기에 중위 연산자는 특별히 우선순위를 가지게 됩니다.
중위 연산자의 우선순위는 더 높은 우선순위, 더 낮은 우선순위, 결합방향, 할당방향을 명시합니다.
만약 중위 연산자에 우선순위를 명시하지 않으면 우선순위가 가장 높은 DefalutPrecedence그룹이 할당됩니다.

infix operator <=
// 연산자를 미리 선언합니다.

// 서로의 문자의 수를 비교하는 연산자 입니다.
func <= (str1: String, str2: String) -> Bool{
    return str1.size <= str2.size
}
print( "hello" <= "nice" )
// false

마치며

연산자를 사용자의 입맛에 맞게 정의하고 overload하는 법에 대해 알아보았습니다.
위 내용 중 궁금한 내용은 아래 댓글에 남겨주세요.
위 내용은 야곰님의 Swift 프로그래밍이라는 서적의 내용의 재구성하였습니다.

감사합니다.

'언어 소개 - Swift' 카테고리의 다른 글

Swift - 흐름 제어  (0) 2018.05.29
Swift - 함수  (0) 2018.05.28
Swift - ARC  (0) 2018.05.25
Swift - 고급 데이터 타입  (0) 2018.05.15
Swift - 애플의 새 언어  (0) 2018.05.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday