단항 연산자 : -num, !a, b! 와 같이 하나의 피연산자 앞뒤에 바로 붙여 사용하는 연산자
이항 연산자 : num1 + num2 와 같이 두 개의 피연산자 사이에 위치하는 연산자
삼항 연산자 : a ? b : c의 형태로 스위프트의 삼항 연산자는 ?: 연산자 단 하나만 존재한다.
할당 연산자 (Assignment Operator)
할당 연산자는 값을 초기화 시키거나 변경한다.
let num1 = 100 // 상수
var num2 = 5 // 변수
num2 = num1
// num2 = 100
✔️ 위의 예제와 같이 상수(let), 변수(var)에 사용 가능하다.
let (a, b) = (4, 5)
// a=4, b=5
✔️ 위의 예제와 같이 튜플을 이용해 여러 값을 한번에 할당할 수 있다.
if a = b {
// a= b는 값을 반환하지 않으므로 틀린 문법임.
}
✔️ 위의 예제와 같이 스위프트에서 할당 연산자는 값을 반환하지 않음.
사칙 연산자 (Arithmetic Operators)
스위프트는 모든 숫자 형에서 사용 가능한 4가지 표준 사칙 연산자를 지원함.
덧셈 (+) | 뺄셈 (-) | 곱셈 (*) | 나눗셈 (/) |
let (n1, n2) = (10, 5)
var sum = n1+n2 // 15
var min = n1-n2 // 5
var mul = n1*n2 // 50
var div = n1/n2 // 2
"yeo" + " seongil" // "yeo seongil"
✔️ 위의 예제와 같이 스위프트에서는 덧셈 연산자를 이용하여 위와 같이 문자열을 합칠 수 있다.
✅ 스위프트는 사칙 연산의 값이 오버플로우 되는 것을 허용하지 않는다. 만약 이것을 허용하고 싶으면 스위프트의 오버플로우 연산자를 이용하여 지원할 수 있다.
나머지 연산자 (Remainder Operator)
let (x, y) = (9, 4)
var rem1 = x%y // 1
var rem2 = -x%y // -1
a%b와 같이 나머지 연산을 지원한다.
단항 음수 연산자 (Unary Minus Operator)
let five = 5
let minFive = -five // -5
let plusFive = -minFive // 5
✔️ 위의 예제와 같이 숫자 값은 -로 표현되는 단항 음수 연산자에 의해 부호가 변한다.
단항 양수 연산자 (Unary Plus Operator)
let two = 2
let minTwo = -two // -2
let plusTwo = +minTwo // -2
✔️ 위의 예제와 같이 +로 표현되는 양수 연산자는 부호에 아무런 영향을 끼치지 않는다.
합성 할당 연산자 (Compound Assignment Operators)
var a = 10
a += 5 // a = a+5
// a = 15
✔️ 위의 예제와 같이 할당연산(=)과 덧셈연산(+)으로 구성된 연산을 합성해 += 형태로 축약해 사용 가능하다.
✅ 합성 할당 연산자는 값을 반환하지 않으므로, let b = a+=2 와 같은 문법은 사용할 수 없다.
비교 연산자 (Comparision Operators)
같다 (a == b) | 같지 않다 (a != b) | 크다 (a > b) |
작다 (a < b) | 크거나 같다 (a >= b) | 작거나 같다 (a <= b) |
let (a, b) = (1, 1)
a == b // true
a != 2 // true
a > b // false
a > 0 // true
a < b // false
a < 2 // true
a >= b // true
a >= 1 // true
a >= 2 // false
a <= b // true
a <= 1 // true
a <= 2 // true
✔️ 위의 예제와 같이 각 비교연산은 true or false 값을 반환한다.
let name = "seongil"
if name == "seongil" {
print("true")
} else {
print("false)
}
// true
✔️ 위의 예제와 같이 비교연산은 if-else와 같은 조건 구문에서 자주 사용된다.
(1, "abc") < (2, "bcd") // true, 1이 2보다 작기 때문; abc와 bcd는 비교하지 않음
(1, "abc") > (2, "bcd") // false, 1이 2보다 작기 때문; abc와 bcd는 비교하지 않음
(1, "abc") < (1, "bcd") // true, 1과 1은 같고; abc는 bcd보다 작기 때문
(1, "abc") == (1, "bcd") // false, 1과 1은 같고; abc와 bcd는 다르기 때문
(1, "abc") == (1, "abc") // true, 1과 1은 같고; abc와 abc는 같기 때문
✔️ 위의 예제와 같이 같은 타입의 값을 갖는 두 개의 튜플을 비교할 수 있다. 튜플의 비교는 왼➡️오의 방향으로 이뤄지고 한번에 한 개의 값만 비교한다. 이 비교를 다른 두 값을 비교하게 될 때까지 수행한다.
("a", 1) < ("b", 1) // OK. (String, int)끼리의 비교이므로 비교 가능
("a", 2) < (1, "b") // ERR. (String, int)와 (int, String)의 비교이므로 불가능
(1, 2) <= ("yeo", "seongil") // ERR. (int, int)와 (String, String)의 비교이므로 불가능
("yeo", false) > ("seongil", true) // ERR. Boolean은 < 연산자로 비교가 불가능
✔️ 위의 예제와 같이 튜플은 비교 연산자가 해당 값을 비교할 수 있는 경우에만 비교를 수행할 수 있다.
✅ 스위프트는 객체 비교를 위해 식별 연산자 ===과 !==를 제공한다.
삼항 조건 연산자 (Ternary Conditional Operator)
question ? answer1 : answer2 ➡️ question이 true이면 answer1을, false이면 answer2를 반환한다.
let yeoHeight = 178
let yeo = true
let yeoDreamHeight = yeoHeight + (yeo ? 10 : 0)
// yeoDreamHeight = 188 (178 + 10)
✔️ 위의 예제는 삼항 조건 연산의 예제이다.
let yeoHeight = 178
let yeo = true
if yeo {
yeoDreamHeight = yeoHeight + 10
} else {
yeoDreamHeight = yeoHeight + 0
}
✔️ 위의 예제는 삼항 조건 연산자를 풀어 쓴 것이다.
Nil 병합 연산자 (Nil-Coalescing Operator)
nil : '값이 없음'을 뜻한다.
nil은 스위프트나 Objective-C에서 쓰이는 것으로, 단순한 의미에서는 NULL과 유사하나 '어떤'값이 없느냐가 중요하다.
✅ 스위프트의 nil 값의 경우 특정 타입에 대한 값의 부재를 표현한다.
a ?? b ➡️ 옵셔널 a를 unwraps해서 만약 a가 nil인 경우 b를 반환하고, nil이 아닌 경우 a를 반환한다.
a != nil ? a! : b
✔️ 위의 예제는 nil 병합 연산자를 풀어 쓴 것이다.
let color = "blue"
var setColor: String
var colorUse = setColor ?? color
// setColor가 nil이므로 color를 반환하여 colorUse = "blue"
let color = "blue"
var setColor: "red"
var colorUse = setColor ?? color
// setColor가 nil이 아니므로 setColor를 반환하여 colorUse = "red"
let nilSet1 = 1
let nilSet2: String
var nilTest1 = nilSet2 ?? nilSet1 // ERR. 같은 타입만 비교할 수 있다
✔️ 위의 예제와 같이 같은 nil 병합 연산자는 같은 타입만 비교할 수 있다.
범위 연산자 (Range Operators)
1️⃣ 닫힌 범위 연산자 (Closed Range Operator)
(a...b)의 형태로 범위의 시작과 끝이 있는 연산자이다. 주로 for-in loop에 사용 된다.
for numIndex in 1...10 {
print(numIndex)
}
// 1
// 2
// ...
// 10
2️⃣ 반 닫힌 범위 연산자 (Half-Open Range Operator)
(a..<b)의 형태로 a부터 b보다 작을 때까지의 범위를 갖는다. 즉, a부터 b-1까지의 값을 가지며 배열을 다루는데 유용하다.
✅ 반 닫힌 범위 연산자는 설정 값이 범위에 포함되지 않는다.
let names = ["yeo", "kim", "kang", "lee"]
let count = names.count
for i in 0..<count {
print("Student \(i+1) is called \(names[i])")
}
// Student 1 is called yeo
// student 2 is called kim
// student 3 is called kang
// student 4 is called lee
3️⃣ 단방향 범위 (One-Side Ranges)
[a..] [..a]의 형태로 범위의 시작 혹은 끝만 지정해 사용하는 범위 연산자이다.
✅ 단방향범위 연산자는 지정한 시작 값 혹은 끝 값은 범위에 포함된다.
let names = ["seongil", "jihun", "jaeyul", "nayul"]
for name in names[2...] {
print(name)
}
// jaeyul
// nayul
for name in names[...2] {
print(name)
}
// seongil
// jihun
// jaeyul
✔️ 위에서 설명했듯이 지정한 시작 값 혹은 끝 값이 범위에 포함되어 출력 된다.
let names = ["seongil", "jihun", "jaeyul", "nayul"]
for name in names[..<2] {
print(name)
}
// seongil
// jihun
✔️ 위의 예제와 같이 반 닫힌 연산자는 설정 값이 범위에 포함되지 않고 출력 된다.
논리 연산자 (Logical Operators)
논리 부정 NOT (!a) | 논리 곱 AND (a && b) | 논리 합 OR (a || b) |
1️⃣ 논리 부정 연산자 (Logical NOT Operator)
let banana = false
if !banana {
print("monkey")
}
// monkey
✔️ 위의 예제와 같이 논리 부정 연산자는 해당 값을 부정한다.
2️⃣ 논리 곱 연산자 (Logical AND Operator)
let doorOpen = true
let doorPW = false
if doorOpen && doorPW {
print("open")
} else {
print("close")
}
// close
✔️ 위의 예제와 같이 논리 곱 연산자는 하나라도 false이면 false이다.
3️⃣ 논리 합 연산자 (Logical OR Operator)
let doorKey = false
let doorPW = true
if doorKey || doorPW {
print("open")
} else {
print("close")
}
// open
✔️ 위의 예제와 같이 논리 합 연산자는 하나라도 true이면 true이다.
논리 연산자의 조합 (Combining Logical Operators)
let a = true
let b = false
let c = true
let d = false
if a && b || c || d {
print("1")
} else {
print("2")
}
// 1
✔️ 위의 예제와 같이 두 개 이상의 논리 연산자를 조합해서 사용할 수 있다.
✅ 스위프트의 논리 연산자 &&와 ||는 왼쪽의 표현을 우선해서 논리 계산한다.
명시적 괄호 (Explicit Parentheses)
let a = true
let b = false
let c = true
let d = false
if (a && b) || c || d {
print("1")
} else {
print("2")
}
// 1
✔️ 위의 예제와 같이 괄호를 사용하면 논리 연산자의 적용 우선 순위를 연산자에게 맡기지 않고 계산 순서를 지정할 수 있다.
'Swift > Swift 기본기' 카테고리의 다른 글
06. 클로저 (Closures) (0) | 2023.03.18 |
---|---|
05. 함수 (Functions) (0) | 2023.03.18 |
04. 제어문 (Control Flow) (0) | 2023.03.17 |
03. 콜렉션 타입 (Collection Types) (0) | 2023.03.17 |
02. 문자열과 문자 (Strings and Characters) (0) | 2023.03.16 |