[Swift] 기본 연산자들 (Basic Operators) - 2

팔랑이·2023년 6월 9일
post-thumbnail

23-05-01


삼항 조건 연산자 (Ternary Conditional Operator)

Swift는 question ? answer1 : answer2 로 이루어지는 삼항 조건 연산자를 제공한다. question이 true인지 false인지를 기반으로 두 가지 answer중 하나를 선택한다. question이 true라면 answer1로 판단하고 그 값을 출력하고, false라면 answer2로 판단하고 그 값을 출력한다.

삼항 조건 연산자는 다음 코드를 짧게 줄인 것이다.

if question {
    answer1
} else {
    answer2
}

table 열의 높이를 계산하는 예시를 들어보자. 열의 높이는 header가 있다면 내용 문단의 높이보다 50points는 높아야 하고, header가 없다면 20points는 높아야 한다.

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight is equal to 90

삼항 조건 연산자는 짧은 코드로 편리함을 제공하지만, 과다하게 사용되면 코드가 읽기 어려워질 수도 있다. 여러 삼항 조건 연산자를 하나의 복합문에 결합해서 쓰지 않도록 하자.



Nil 병합 연산자 (Nil-Coalescing Operator)

nil 병합 연산자 (a ?? b) 는 옵셔널 a가 값을 가지고 있다면 그 값을 unwrap하고, nil이면 디폴트값인 b를 반환한다. nil 병합 연산자는 다음의 코드를 단축한 것이다.

a != nil ? a! : b
// a ?? b 로 단축하여 보다 간단하고 읽기 쉬워짐

nil과 옵셔널의 강제추출에 대해서는 다음의 링크를 클릭

nil 병합 연산자를 사용해 디폴트 색상 이름을 사용할지 user가 정한 색상이름을 사용할지 선택하는 예시를 살펴보자.

let defaultColorName = "red"
var userDefinedColorName: String?   // defaults to nil

var colorNameToUse = userDefinedColorName ?? defaultColorName
// colorNameToUse is set to the default of "red"

userDefinedColorName에 값을 부여한다면,

userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// colorNameToUse is set to "green"



범위 연산자 (Range Operators)

Swift가 제공하는 여러 범위 연산자를 사용하여 값의 범위를 간편하게 표현할 수 있다.

닫힌 범위 연산자 (Closed Range Operator)

닫힌 범위 연산자 (a...b)는 a 이상 b 이하의 범위를 정의한다. 닫힌 범위 연산자는 for-in 루프문과 같이 사용하고자 하는 모든 값의 범위 내에서 반복할 때 유용하다.

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

반 개방 범위 연산자 (Half-Open Range Operator)

Half-Open Range Operator (a..<b) 는 a 이상 b 미만의 범위를 정의한다. 반 개방 범위 연산자는 배열과 같이 0부터 시작하는 list를 작업할 때 유용하다.

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

단방향 범위 (One-Sided Ranges)

범위 연산자의 한쪽 범위값을 생략하여 한쪽 인덱스부터 배열 끝까지의 범위를 정의할 수 있다.

for name in names[2...] {
    print(name)
}
// Brian
// Jack


for name in names[...2] {
    print(name)
}
// Anna
// Alex
// Brian

반개방 범위 연산자와 함께도 사용하여 초과, 미만의 범위도 정의할 수 있다.

for name in names[..<2] {
    print(name)
}
// Anna
// Alex

단방향 범위 연산자를 반복문에서 사용할 수 있지만, 첫 번째 값이 생략된 단방향 범위 연산자는 반복의 시작값이 모호해 반복문에서 샤용할 수 없다. 마지막 값이 생략된 단방향 범위 연산자는 반복문에서 사용할 수 있지만, 반드시 루프문의 탈출 조건을 명료하게 설정해야 한다.



논리 연산자 (Logical Operators)

논리 연산자는 Bool의 논리값인 true와 false를 수정하거나 결합할 수 있다. Swift는 세 가지 논리연산자를 제공한다.

  • Logical NOT (!a)
  • Logical AND (a && b)
  • Logical OR (a || b)

Logical NOT Operator

false가 true가 되게 하고, true가 false가 되게 하는 연산자이다. 접두사로서 사용되며, 띄어쓰기 없이 사용하고자 하는 값 바로 앞에 붙인다.

let allowedEntry = false
if !allowedEntry {
    print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"

위의 예시와 같이 Boolean과 상수, 변수의 이름을 잘 설정해서 정확하고 읽기 쉬운 코드를 짜도록 해야 한다. double negative를 피하고 논리적으로 헷갈리는 문장을 쓰지 않도록 하자.

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"

Logical OR Operator

(a || b)는 둘 중 하나가 true일 때 true를 반환하는 논리연산자이다.

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorkey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints ("Welcome!")

논리연산자를 결합하여 사용

다음과 같이 논리연산자를 결합하여 사용할 수 있다.

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "Welcome!"

명시적 괄호 (Explicit Parentheses)

위의 예시에서, 복잡한 식을 읽기 쉽게 하고 의도를 표현하기 위해 괄호를 사용할 수 있다.

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "Welcome!"

🌏 참고사이트
Swift Language Guide

profile
정체되지 않는 성장

0개의 댓글