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

LEEHAKJIN-VV·2022년 5월 11일
0

Study-Swift 5.6

목록 보기
12/22

참고 사이트:
The Swift Programming Language


Basic Operators (기본 연산자)

Swift에서는 통상적으로 이용하는 (+, -, /, %) 산술 연산자와 (&&, ||) 논리 연산자, C에서 지원하지 않는 (a..<b, a...b)와 같이 범위를 지정할 수 있는 범위 연산자를 지원한다.


Terminology (용어)

연산자의 종류에는 unary(단항), binary(이항), 삼항(ternary) 연산자가 있다.

  • Unary operator(단항 연산자): -a, !b, c!와 같이 하나의 대상의 앞뒤에 바로 붙어 사용하는 연산자
  • Binary operator(이항 연산자): a+3와 같이 2개의 대상에 사용하는 연산자
  • Ternary Operator(삼항 연산자): Swift에서는 단 1개의 삼항 연산자를 제공한다. (a ? b :C)

Assigement Operator (할당 연산자)

(a=b) 와 같은 할당 연산자는 값을 초기화 시키거나 값을 할당하는데 사용한다.

let b = 10
var a = 5
a = b
// a is now equal to 10

튜플을 이용하여 상수나 변수에도 할당이 가능하다.

let (x, y) = (1, 2)
// x is equal to 1, and y is equal to 2

C와 Objective-C의 할당 연산자와 다르게 Swift의 할당 연산자는 값을 반환하지 않는다. 다음은 유효하지 않는 구문이다.

if x = y {
    // This isn't valid, because x = y doesn't return a value.
}

이는 사실 비교 연산자(==) 대신 할당 연산자(=)가 대신 잘못 사용되는 것을 방지한다.


Arithmetic Operators (산술 연산자)

Swift는 4가지의 표준 산술 연산자를 제공한다.

  • Addition (+)
  • Subtraction (-)
  • Multiplication (*)
  • Division (/)
1 + 2       // equals 3
5 - 3       // equals 2
2 * 3       // equals 6
10.0 / 2.5  // equals 4.0

C와 Objective-C의 산술 연산자와 다르게 Swift의 산술 연사자는 기본적으로 값이 오버플로우 되는 것을 허용하지 않는다. 만약 오버플로우를 원하면 (a + &b)와 같은 오버플로우 연산자를 통해 가능하다.


Remainder Operator (나머지 연산자)

a%b와 같이 나머지 연산을 지원한다.

9 % 4    // 1
-9 % 4   // -1 -> (9 = (4 * -2) + (-1))

NOTE
다른 언어에서 나머지 연산자는 모듈로 연산(%)이라고 알려져 있다. 그러나 Swift에서 음수의 나머지 연산자는 엄밀히 말하자면 모듈러 연산이 아닌 나머지라는 것을 보여준다.


unary Minus Operator (단항 음수 연산자)

단항 음수 연산자 (-)는 숫자가 음수라는 것을 표현한다.

let three = 3
let minusThree = -three       // minusThree equals -3
let plusThree = -minusThree   // plusThree equals 3, or "minus minus three"

Unary Plus Operator (단항 양수 연산자)

단항 양수 연산자(+)는 양수를 표현하며, 실제로 아무 일도 하지 않지만 마이너스(-) 연산시 양수에 대해 대칭성을 제공한다. ex) [4 + (-2)]

let minusSix = -6
let alsoMinusSix = +minusSix  // alsoMinusSix equals -6

Compound Assignment Operator (합성 할당 연산자)

Swift는 (a+=2)와 같이 할당 연산과 덧셈 연산으로 구성된 연산을 하나로 합쳐 표현을 축약 할 수 있다.

var a = 1
a += 2
// a is now equal to 3

NOTE
할당 연산자는 값을 반환하지 않는다. 그러므로 다음과 같이 작성할 수 없다.
let b = a += 2


Comparison Operators

Tuple Comparison

튜플도 비교연산자로 값을 비교할 수 있다. 튜플의 비교는 왼쪽에서 오른쪽 방향으로 이뤄지고 한번에 한개의 값만 비교한다.

(1, "zebra") < (2, "apple")   // true because 1 is less than 2; "zebra" and "apple" aren't compared
(3, "apple") < (3, "bird")    // true because 3 is equal to 3, and "apple" is less than "bird"
(4, "dog") == (4, "dog")      // true because 4 is equal to 4, and "dog" is equal to "dog"

NOTE
Swift의 표준 라이브러리에서는 7개 요소 미만을 갖는 튜플만 비교할 수 있다. 만약 원소가 7개 이상이라면 직접 비교 연산자를 구현해야 한다.


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

삼항 조건 연산자는 다음과 같은 표현식을 갖는다. qustion ? answer1 : answer2 만약 quesion이 true라면 answer1의 값을 가지고 false라면 answer2의 값을 가진다.

삼항 조건 연산자는 아래 코드의 축약이다.

if question {
    answer1
} else {
    answer2
}

삼항 조건 연산자를 실제 사용한 예제다.

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

위의 코드는 조건문을 이용해 다음과 같이 표현할 수 있다.

let contentHeight = 40
let hasHeader = true
let rowHeight: Int
if hasHeader {
    rowHeight = contentHeight + 50
} else {
    rowHeight = contentHeight + 20
}
// rowHeight is equal to 90

삼항 조건 연산자를 이용하면 코드가 간결해진다. 그러나 과도한 사용은 오히려 코드의 가독성을 저하 시키므로 적절한 사용이 필요하다.


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

nil 병합 연산자인 (a ?? b)는 a에 값이 존재하는 경우 optinal인 a를 unwrap 하고, nil인 경우 b 값을 반환한다. 이 표현식은 항상 optional type이다. 표현식 b는 a의 내부에 있는 타입과 일치해야 한다.

nil 병합 연산자는 다음 코드의 축약형이다.

a != nil ? a! : b

이 코드는 optional a가 nil이 아니면 a를 unwrap 하고 nil 이면 b를 반환하라는 의미다.

다음 예제를 통해 확인해 보자.

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

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

userDefinedColorName은 optional type이고 기본값은 nil이다. 그렇기 때문에 nil 병합 연산자에서 default color인 red가 할당된다.

만약 userDefinedColorName을 nil이 아닌 다른 색을 할당하면 할당한 색이 사용되는 것을 확인할 수 있다.

userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName isn't nil, so colorNameToUse is set to "green"

Range Operators (범위 연산자)

Swift는 몇명의 범위 연산자를 제공한다.

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

닫힌 범위 연산자는 다음과 같은 형태이다. (a...b) 이 형태는 a와 b 을 포함하여 a부터 b까지의 범위를 나타낸다. 그리고 항상 a의 값은 b보다 작다.

이 닫힌 범위 연산자는 for-in loop에서 자주 사용된다.

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 (반 닫힌 범위 연산자)

반-닫힌 범위 연산자인 (a..<b)는 b를 포함하지 않는 a부터 b의 범위를 정의한다. 마찬가지로 a 값은 b보다 작다. 만약 a와 b의 값이 같다면 범위는 비게 된다.

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-Side Ranges (단방향 범위)

[a..], [..a]의 형태로 한쪽의 범위를 생략하고 다른 한쪽의 끝만 지정하여 단방향으로 범위를 가질 수 있다. 다음 예제를 통해 확인해 보자.

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

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

위의 예제인 경우 시작 혹은 끝의 값이 범위에 포함된 것을 확인할 수 있다. 그러나 앞에서 설명한 half-open range operator(반-닫힌 연산자)는 범위에 마지막 값이 포함되지 않는 것을 확인할 수 있다.

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

One-sided ranges(한 방향 범위)는 subscript뿐만 아니라 다른 context에서도 사용이 가능하다. 아래 코드와 같이 특정한 값이 범위에 포함되어 있는지 확인할 수 있다.

let range = ...5
range.contains(7)   // false
range.contains(4)   // true
range.contains(-1)  // true

Logical Operators (논리 연산자)

Swift는 3가지 표준 논리 연산자를 제공한다.

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

Logical NOT Operator (논리 부정 연산자)

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

Logical AND Operator (논리 곱 연산자)

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"

Logical OR Operator (논리 합 연산자)

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

Combining Logical Operators (논리 연산자의 조합)

2개 이상의 논리 연산자를 조합하여 하나의 표현식으로 만들 수 있다.

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

Swift에서 논리 연산자는 왼쪽의 표현을 우선해서 논리 계산을 한다.


Explicit Parentheses (명시적 괄호)

여러개의 논리 연산자가 사용된 경우 괄호를 사용하여 연산자 적용 순위를 명시적으로 지정할 수 있다.

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

괄호를 사용하면 코드의 가독성이 높아져 의도를 더 명확히 하는데 도움이 된다. 항상 코드를 작성할 때 간결함 보다는 코드의 가독성을 중요시 하자.

0개의 댓글