operator (연산자) 란 값을 검사, 변경, 조합 하는데 사용되는 기호이다.
Swift 에서는 C언어에서 제공하는 연산자들을 지원한다. 또한 흔한 에러를 예방하기위하여 몇가지 기능을 지원한다. 할당연산자 = 는 값을 반환하지 않는다. 동등연산자를 사용하고자 하였을 때, 할당연산자 = 을 잘못하용하지 않도록 예방하기위해서이다. 산술연산자들은 값의 overflow 를 감지하여, 이를 불허한다. 허용된 범위 외의 값들을 다룰 때 예상치못한 결과를 피하기 위해서이다. 값의 overflow 에 대한 행동을 overflow 연산자를 활용해서 고를 수 있다. 이는 Overflow Operators 문서에 기술되어 있다.
또한 Swift 는 C언어에 없는 범위 연산자를 제공한다. ( a...<b), (a...b)
이 챕터에서는 흔히 사용되는 연산자들에 대해서 알아보고, Advanced Operators 문서에서 심화된 연산자들에 대해서 알아보겠다. Advanced Operators 에서는 어떻게 연산자를 커스터마이징하고, 커스텀 타입에 대해 표준 연산자를 구현하는 지에 대해서 알아볼 예정이다.
Terminology 용어들
연산자에는 Unary,binary, ternary 연산자들이 있다.
•
Unary : 단항
◦
prefix : !c
◦
postfix : c!
•
binary : 이항
•
ternary : 삼항
Assignment Operator
할당 연산자는 b의 값을 갱신하거나, 초기화 한다.
let b = 10
var a = 5
a = b
// a is now equal to 10
Swift
복사
우 변에 여러개의 값을 가지는 튜플을 할당한다면, 각 원소는 분해되어서 여러개의 상수 또는 변수로 한번에 할당된다.
let (x, y) = (1, 2)
// x is equal to 1, and y is equal to 2
Swift
복사
C나 Objective-C 와는 다르게, Swift 의 할당 연산자는 값 그 자체를 리턴하지 않는다. 아래 구문은 사용이 불가하다.
if x = y {
// This isn't valid, because x = y doesn't return a value.
}
Swift
복사
동등연산자를 사용하고자 하였을 때 오타를 잡아줄 수 있게된다.
산술연산자
Swift 는 모든 숫자에 대한 표준 산술연산을 제공한다.
•
Addition (+)
•
Subtraction ()
•
Multiplication ()
•
Division (/)
C나 Objective C 의 산술연산자와는 다르게 Swift 의 산술연산자는 기본적으로 overflow 를 허용하지 않는다. 다만 overflow 연산자를 활용하여서 값의 오버플로우에 대한 행동을 고를 수 있다. (a &+ b)
덧셈 연산자는 String 에도 사용이 가능하다
"hello, " + "world" // equals "hello, world"
Swift
복사
Remainder Operator
나머지 연산자는 나머지를 리턴한다.
% 는 여타 다른언어에서는 modulo 연산자로 사용된다. Swift 에서는 나머지 연산자로 사용됨에 주의하자.
내부적으로 나머지 연산자는 아래의 등식을 계산한다.
a = (b x some multiplier) + remainder
다음 코드의 결과를 생각해보자
-9 % 4
Swift
복사
-9 = (4 x -2) + -1 이므로 나머지는 -1 이된다.
단 b의 부호는 항상 무시된다.
a % b
a % -b
Swift
복사
위 두 코드는 항상 같은 값을 리턴한다.
Unary Minus Operator
- prefix 를 사용하여 숫자를 토글할 수 있다.
(띄어쓰기 금지)
let three = 3
let minusThree = -three // minusThree equals -3
let plusThree = -minusThree // plusThree equals 3, or "minus minus three"
Swift
복사
Unary Plus Operator
+ prefix 는 어떠한 변경도 하지 않지만 코드의 명확성을 위해 삽입가능하다.
Compund Assignment Operators
C언어 처럼 Swift 는 가산 연산자를 제공한다.
var a = 1
a += 2
// a is now equal to 3
Swift
복사
a += 2 는 a = a + 2 의 줄임말이다.
가산연산자는 값을 리턴하지 않는다. b = a += 2 이 코드는 무효하다.
Comparison Operators 비교연산자
아래와 같은 비교연산자를 제공한다.
•
Equal to (a == b)
•
Not equal to (a != b)
•
Greater than (a > b)
•
Less than (a < b)
•
Greater than or equal to (a >= b)
•
Less than or equal to (a <= b)
Swift 는 두개의 식별연산자 === !== 를 제공하며, 이 두 연산자를 사용해서, 두 객체가 같은 객체를 참조하고 있는지 테스트 할 수 있다.
1 == 1 // true because 1 is equal to 1
2 != 1 // true because 2 isn't equal to 1
2 > 1 // true because 2 is greater than 1
1 < 2 // true because 1 is less than 2
1 >= 1 // true because 1 is greater than or equal to 1
2 <= 1 // false because 2 isn't less than or equal to 1
Swift
복사
위 비교연산자는 Bool 값을 리턴한다.
비교연산자는 조건문에 자주 사용된다.
let name = "world"
if name == "world" {
print("hello, world")
} else {
print("I'm sorry \(name), but I don't recognize you")
}
// Prints "hello, world", because name is indeed equal to "world".
Swift
복사
튜플도 비교가 가능하다. 왼쪽부터 한번에 하나씩 비교하며, 이 비교는 false 가 발견될 때 까지 지속한다. 모든 원소가 조건에 부합한다면 true 를 반환하고 하나라도 조건에 부합하지 않는다면 false 를 반환한다.
•
같은 타입
•
같은 값
단, 하나의 원소라도 비교가 불가능한 타입이라면 Error 가 발생한다.
("blue", -1) < ("purple", 1) // OK, evaluates to true
("blue", false) < ("purple", true) // Error because < can't compare Boolean values
Swift
복사
Swift standard library 에서는 최대 6개의 원소를 가지는 튜플에 대해서만 튜플 비교 연산을 지원한다. 이보다 더 많은 원소를 가지는 튜플에 대해서는 비교연산자를 새로 구현해야한다.
Ternary Conditional Operator
삼항 조건 연산자는 세부분을 가지는 특별한 연산자이다.
형태는 다음과 같다.
question ? answer1 : answer2
let contentHeight = 40
let hasHeader = true
let rowHeight: Int
if hasHeader {
rowHeight = contentHeight + 50
} else {
rowHeight = contentHeight + 20
}
// rowHeight is equal to 90
Swift
복사
위 코드를 아래로 축약할 수 있다.
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight is equal to 90
Swift
복사
hasHeader 값이 true 이면 50 false 이면 20 을 리턴한다.
Nil-Coalescing Operator
닐 콜리싱 연산자는 옵셔널 값을 unwrap 한다.
닐 콜리싱은 아래의 코드(삼항 조건 연산자)에 대한 축약이다./
a != nil ? a! : b
Swift
복사
a의 값이 존재하면 a의 본래 값이 리턴되고 그렇지않다면 b 를 리턴한다.
let defaultColorName = "red"
var userDefinedColorName: String? // defaults to nil
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName is nil, so colorNameToUse is set to the default of "red"
Swift
복사
Range Operators
Swift 범위 값을 표한하는 range operator 를 제공한다.
Closed Range Operator
마지막원소 포함
for index in 1...5 {
print("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
Swift
복사
Half-Open Range Operator
마지막원소 미포함
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
Swift
복사
One-Sided Range
시작원소 또는 끝원소만 명시 제한된 범위의 끝까지
for name in names[2...] {
print(name)
}
// Brian
// Jack
for name in names[...2] {
print(name)
}
// Anna
// Alex
// Brian
Swift
복사
half open range operator 또한 one sided form 을 가진다
for name in names[..<2] {
print(name)
}
// Anna
// Al
Swift
복사
이러한 One-Sided Range 는 다른 상황에도 사용이 가능하다.
하지만 반복이 어디서 시작되어야 하는지 명확하지 않기 때문에 첫 번째 값이 생략된 One-Sided Range 에 대해서는 반복이 불가능하다. 최종 값을 생략하는 One-Sided Range 에 대해서는 반복이 가능하지만 범위가 무제한으로 계속되기 때문에 루프에 명시적인 끝 조건을 추가해야한다.
아래 코드에서는 어떤 값이 포함되어 있는 지 확인해볼 수 있다.
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
Swift
복사
Logical Operator
논리연산자는 Boolean 논리 값 true 와 false 를 조합한다.
Swift 에서는 3가지 기본 논리연산자를 제공한다. (C언어 기반)
•
Logical NOT (!a)
•
Logical AND (a && b)
•
Logical OR (a || b)
Logical NOT Operator
부정 논리연산자는 Boolean 값을 토글합니다.
prefix operator 이다.
let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
Swift
복사
느낌표를 not 으로 읽으면 구문해석이 자연스러워 진다.
이중 부정을 피해야한다. 가독성을 위해
Logical And Operator
a && b
양 쪽이 모두 true 여야 true 리턴
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
Swift
복사
Logical OR Operator
a || b
둘 중 하나라도 true 면 true 리턴
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
Swift
복사
Combining Logical Operators
여러개의 논리 연산자를 동시에 사용 가능하다.
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
Swift
복사
위코드는 아래와 같다.
enteredDoorCode && passedRetinaScan 두조건을 동시에 만족하거나,
doorkey 를 갖고있거나, 긴급 패스워드를 알고있거나.
Swift 의 && || 두 연산자는 왼쪽부터 순서대로 계산된다.
Explicit Parentheses
괄호를 활용해서 논리연산의 순서를 지정해줄 수 있다.
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
Swift
복사
위 코드의 결과는 그위에와 같으나, 가독성이 더 좋다.