ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [레인스톤 iOS] 스위프트 easy하게 배워볼까? - 연산자(2)
    Swift 기초문법 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편에 걸쳐서 연산자에 대해 알아봤습니다.

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

    반응형

    댓글

Designed by Tistory.