새소식

iOS/Swift

[Swift] 연산자

  • -
참조 :  Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)

 

 

연산자


- 특정한 문자로 표현한 함수

- 연산자에 의해 연산 되는 값의 수에 따라 단항, 이항, 삼항 등으로 구분

- 연산자 위치에 따라 전위. 중위, 후위 등으로 구분

 

 

비교 연산자


- 값을 할당할 때 사용하는 연산자

 

부호 설명
A === B A와 B가 참조(레퍼런스) 타입일 때 A와 B가 같은 인스턴스를 가리키는지 비교하여 불리언 값을 반환
A !== B A와 B가 참조(레퍼런스) 타입일 때 A와 B가 같지 않은 인스턴스를 가리키는지 비교하여 불리언 값을 반환
A ~= B A와B의 패턴이 매치되는지 확인하여 불리언 값을 반환

 

 

삼항 조건 연산자


- 피연산자가 세 개인 삼항 조건 연산자

 

부호 설명
Question ? A:B Question(불리언 값)이 참이면 A, 거짓이면 B를 반환

 

 

범위 연산자


- 값(수)의 범위를 나타내고자 할 때 사용

 

연산자 부호 설명
폐쇄 범위 연산자 A...B A부터 B까지의 수를 묶어 범위를 표현
A와 B를 포함
반폐쇄 범위 연산자 A..<B A부터 B미만까지의 수를 묶어
범위를 표현
A를 포함, B는 포함하지 않음
단방향 범위 연산자 A... A 이상의 수를 묶어 표현, A를 포함
...A A 이하의 수를 묶어 표현, A를 포함
..<A A 미만의 수를 묶어 표현, A를 포함하지 않음

 

복합 할당 연산자


- 할당 연산자와 다른 연산자가 하는 일을 한 번에 할 수 있도록 결합할 수 있음

 

표현 설명 같은 표현
A += B A와 B의 합을 A에 할당 A = A + B
A -= B A와 B의 차를 A에 할당 A = A - B
A *= B A와 B의 곱을 A에 할당 A = A * B
A /= B A를 B로 나눈 값을 A에 할당 A = A / B
A %= B A를 B로 나눈 나머지를 A에 할당 A = A % B

 

 

 

 

오버플로 연산자


- 기존 프로그래밍 언어에서는 오버플로 가능성 있는 연산에 대해 따로 추가 알고리즘 및 로직들을 설계했음

- Swift에서는 연산자를 통해 오버플로 대비, 오버플로 연산자를 사용하여 오버플로를 자동으로 처리

 

연산자 부호 설명
오버플로 더하기 연산 &+ 오버플로에 대비한 덧셈연산
오버플로 빼기 연산 &- 오버플로에 대비한 뺄셈연산
오버플로 곱하기 연산 &* 오버플로에 대비한 곱셈연산

 

 

 

기타 연산자


 

연산자 부호 설명
nil 병합 연산자 A ?? B A가 nil이 아니면 A를 반환하고,
A가 nil이면 B를 반환
(옵셔널 사용할 때 매우 유용)
부호변경 연산자 -A A(수)의 부호를 변경
옵셔널 강제 추출 연산자 O! O(옵셔널 개체)의 값을 강제로 추출
옵셔널 연산자 V? V(옵셔널 값)를 안전하게 추출하거나,
V가 옵셔널임을 표현

 

※ 옵셔널 강제 추출 연산자 사용하는 것을 지양하는 것이 좋음 

 

연산자의 우선순위


- 연산자의 우선순위가 지정 되어 있음

- 우선순위가 높은 연산자가 제일 먼저 실행

- 결합방향도 지정 되어 있음

- 스위프트 연산자의 연산자 우선순위는 절대치가 아닌 상대적인 수치

 

 

 

연산자 우선순위 그룹


- 연산자 뒤에 콜론을 붙이고 이어서 작성하여 지정

 

 

 

사용자 정의 연산자


- 기존 연산자의 역할을 변경하거나 새로운 역할을 추가하기 위해서는 기존의 연산자가 전위 연산자인지, 중위 연산자인지,
후위 연산자인지 알아야 함

- 전위 연산자(prefix) : 연산자가 피연산자 앞에 위치하는 연산자 ex) 부울 부정 논리 연산(NOT) 연산자(!)

- 중위 연산자(infix) : 피연산자 사이에 위치하는 연산자, 많은 수의 연산자가 여기에 속함

- 후위 연산자(postfix) : 피연산자 뒤에 위치하는 연산자 ex) 옵셔널 강제추출 연산자

- operator(연산자), associativity(연산자 결합방향), precedence(우선순위)

 

- 아스키문자(ASCII Code)와 결합해서 사용

- .(마침표)를 사용자 정의 연산자에 사용 가능, 연산자를 표현하는 문자 중 맨 처음의 문자가 마침표일 때만 연산자에 포함된
마침표가 연산자로 인식됨, 만약 마침표로 시작되지 않는 연산자에 마침표가 들어가게 되면 이를 인식 불가

- ?(물음표), !(느낌표) 자체만으로는 사용자 정의 연산자를 정의할 수 없음
- 전위 연산자는 ! 나 ? 시작하는 사용자 정의 연산자를 정의할 수 없음

- 예약어는 재정의 할 수 없음

 

- 전위 연산자 구현과 사용

 

prefix operator **

prefix func ** (value: Int) -> Int{
	return value * value
}

let minusFive: Int = -5
let sqrtMinusFive: Int = **minusFive

print(sqrtMinusFive) // 25

 

 

- 후위 연산자 구현과 사용

※ 하나의 피연산자에 전위 연산과 후위 연산을 한 줄에 사용하게 되면 후위 연산을 먼저 수행

 

postfix operator **

postfix func ** (value: Int) -> Int{
	return value + 10
}

let five: Int = 5
let fivePlusTen: Int = five**

print(fivePlusTen) // 15

 

 

- 중위 연산자의 구현과 사용

- 중위 연산자는 우선순위 그룹을 명시할 수 있음

- precedencegroup 뒤에 그룹 이름을 써주어 정의

- associativity에 결합방향이 있는 것은 연달아 사용 가능, 결합방향이 없는(부등호 연산자) 경우 연달아 사용 불가

- 옵셔널 체이닝이 있는 경우에는 연산자의 우선순위 지정 → 연산자에 옵셔널 체이닝이 있는 경우 왼쪽부터 옵셔널 체이닝

- 우선순위 그룹을 명시하지 않으면 가장 우선순위가 높은 DefaultPrecedence그룹을 우선순위 그룹으로 가짐

 

precedencegroup 우선순위 그룹 이름{
	higherThan: 더 낮은 우선순위 그룹 이름
    lowerThan: 더 높은 우선순위 그룹 이름
    associativity: 결합방향(left / right / none)
    assignment: 할당방향 사용(true / false)
}

 

- 중위 연산자의 구현과 사용

 

// String 타입의 contains(_:) 매서드를 사용하기 위해 import
import Foundation

infix operator ** : MultiplicationPrecedence

func ** (lhs: String, rhs: String) -> Bool{
	return lhs.contains(rhs)
}

let helloKim: String = "Hello Kim"
let kim: String = "Kim"
let isContainsKim: Bool = helloKim ** Kim // true

 

728x90

'iOS > Swift' 카테고리의 다른 글

[Swift] 옵셔널(Optional)  (0) 2022.09.15
[Swift] 함수  (0) 2022.09.14
[Swift] 맵, 필터, 리듀스  (0) 2022.09.14
[Swift] regular expression  (0) 2022.09.07
[Swift] 배열  (0) 2022.09.07
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.