[레인스톤 iOS] 스위프트 easy하게 배워볼까? - 연산자(2)
안녕하세요!
iOS개발자로 일하고있는 레인스톤입니다:)
오늘은 연산자 2편!
삼항 연산자부터 알아보겠습니다.
삼항 조건 연산자
let myMoney = 1_000_000
var describeMySelf = ""
if myMoney >= 1_000_000_000 {
describeMySelf = "부자"
} else {
describeMySelf = "거지"
}
print(describeMySelf) //거지ㅠㅠ
자 이런 코드가 있다고 가정할 때 삼항 조건 연산자를 활용하면 코드가 어떻게 달라질까요?
힌트~! 삼항 조건 연산자는 기본적으로 question ? answer1: answer2 의 구조를 가지고 있습니다.
let myMoney = 1_000_000
let describeMySelf = myMoney >= 1_000_000_000 ? "부자":"거지"
print(describeMySelf)
짠 ~ 코드가 매우 간결해졌죠?
삼항 조건 연산자는 코드를 짧게 만들어 가독성을 높이는데 좋습니다:)
삼항 연산자와 nil의 병합
let defaultStatus = "행복"
var sadness: String?
print(sadness ?? defaultStatus) // 행복
nil 병합 연산자는 기본적으로 a ?? b 의 구조를 가지고 있습니다.
a의 값이 nil이라면 b의 값을 선택하는 개념입니다.
반대로 nil이 아니라면 a의 값을 선택하는 것이죠!
let defaultStatus = "행복"
var sadness: String?
sadness = "슬픔"
print(sadness ?? defaultStatus) // 슬픔
그래서 sadness 변수에 값이 생긴다면? 슬픔이 출력됩니다.
nil 병합 연산자는 삼항 조건 연산자와 nil을 활용해서 만들어졌습니다.
따라서 풀어서 살펴보면 아래와 같은 구조를 가지고 있습니다.
let defaultStatus = "행복"
var sadness: String?
print(sadness != nil ? sadness! : defaultStatus) // 행복
일반적으로는 a ?? b의 형태로 사용합니다:)
범위 연산자
닫힌 범위 연산자
for i in 1...5 {
print(i)
}
/*
1
2
3
4
5
/*
(a...b)의 형태로 일반적으로 for-loop와 함께 사용됩니다.
반 닫힌 범위 연산자
for i in 1..<5 {
print(i)
}
/*
1
2
3
4
*/
(a..<b)의 형태로 닫힌 범위 연산자와의 차이점이 보이시나요?
닫힌 범위 연산자가 a부터 b를 모두 출력하는 것에 반해
반 닫힌 범위 연산자는 a부터 b-1까지의 값을 갖게됩니다.
그렇기 때문에 배열의 인덱스에 접근할 때 편하게 사용할 수 있습니다.
배열의 인덱스는 0부터 시작하기 때문에 배열의 count-1까지 인덱스를 가지고 있기 때문이죠!
var array = [1, 2, 3, 4, 5]
for i in 0..<array.count {
print(array[i])
}
/*
1
2
3
4
5
*/
단방향 범위 연산자
var array = [1, 2, 3, 4, 5]
print(array[2...]) // [3, 4, 5]
print(array[...2]) // [1, 2, 3]
print(array[..<2]) // [1, 2]
[a...] [...a]의 형태로 범위의 시작 또는 끝만 정해주는 연산자도 있습니다.
물론 반 닫힌 연산자를 활용해서도 사용이 가능합니다.
let range = ...5
print(range.contains(1)) // true
print(range.contains(2)) // true
print(range.contains(5)) // true
이런 방식으로 subscript뿐만 아니라 특정 값 포함 여부도 확인할 수 있습니다.
이 때 range의 타입은 PartialRangeThrough<Int>입니다.
논리 연산자
논리 부정 연산자
let wannaGoToBed = true
if !wannaGoToBed {
print("그래 공부해")
} else {
print("그래도 공부해^^")
}
// 그래도 공부해^^
!a 의 형태를 가지며 true를 false로 false를 true로 바꿔줍니다.
논리 곱 연산자
let swiftGood = true
let iosGood = true
if swiftGood && iosGood {
print("합격")
} else {
print("불합격")
}
// 합격
a&&b 의 형태를 가지며 두 조건이 모두 true일 때를 의미합니다.
취직 조건이 논리 곱 연산자라면(?) swift와 iOS를 모두 잘해야겠군요!
논리 합 연산자
let swiftGood = true
let iosGood = false
if swiftGood || iosGood {
print("합격")
} else {
print("불합격")
}
// 합격
a||b 의 형태를 가지며 두 조건 중 하나의 조건만 true일 때에도 true를 의미합니다.
취직 조건이 논리 합 연산자라면(?) 오호... 둘 중에 하나만 잘 해도 합격이 되겠네요:)
논리 연산자의 조합
let swiftGood = true
let iosGood = false
let csGood = false
let algorithmGood = true
if swiftGood && iosGood || csGood || algorithmGood {
print("합격")
} else {
print("불합격")
}
// 합격
윽... 복잡해지기 시작했습니다.
이런 경우 논리 계산의 순서가 어떻게 될까요?
swift의 논리 연산자 &&와 ||는 왼쪽의 표현을 우선해서 논리 계산을 합니다.
그럼 비록 swiftGood && iosGood이 false라도 false || false || true 이기 때문에 합격입니다!
코테만 잘봐도 합격할 수 있다!?!?
명시적 괄호
let swiftGood = true
let iosGood = false
let csGood = false
let algorithmGood = true
if (swiftGood && iosGood) || csGood || algorithmGood {
print("합격")
} else {
print("불합격")
}
// 합격
물론 이렇게 괄호를 사용하여 명시적으로 순서를 지정해줄 수도 있습니다.
이렇게 지정해주면 코드 가독성이 훨~씬 좋아지겠죠?
끗!
이렇게 2편에 걸쳐서 연산자에 대해 알아봤습니다.
다음엔 문자열과 문자로 돌아오겠습니다!