Swift 기초문법

[레인스톤 iOS] 스위프트 easy하게 배워볼까? - 연산자(2)

레인스톤 2022. 1. 27. 13:58
반응형

안녕하세요!

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편에 걸쳐서 연산자에 대해 알아봤습니다.

다음엔 문자열과 문자로 돌아오겠습니다!

반응형