티스토리 뷰

빵쟁이가 ios 개발자가 되기위해 정독하고자 작성한 글 입니다!

표현이 이상하거나 잘못번역된 부분이 있을수 있습니다. 

혹 누군가 읽다 잘못된 부분이 있으면 댓글로 알려주세요! 

Basic Operators

연산자는 값을 확인, 변경 하거나 결합하는데 사용하는 특수 기호 입니다.

예를 들어 더하기 연산자(+)는 두 개의 숫자를 더합니다.

논리 AND 연산자(&&)는 두개의 Bool 값을 결합하여 참인지 거짓 확인할수 있게 합니다.

Swift는 코딩 오류를 제거하기 위해 여러 기능을 개선한 C와 같은 언어에서 이미 알고 있는 연산자를 지원합니다. 

대입 연산자(=)는 같음 연산자(==)를 의도할 때 잘못 사용되는 것을 방지하기 위해 값을 반환하지 않습니다.

산술 연산자(+, -, *, /, % 등)는 값을 저장하는 유형의 허용된 값 범위보다 크거나 작아지는 숫자로 작업할 때 오버플로를 감지하고 하여 예기치 않은 결과를 방지합니다.

또한 Swift는 값의 범위를 표현하기 위해 C에없던  ..<b 및 ...b와 같은 범위 연산자를 제공합니다.

현재 페이지 에서는 Swift의 일반적인 연산자에 대해 설명합니다.

Advanced Operators 에서는 Swift의 고급 연산자를 다루고 사용자 정의 연산자를 정의하고 사용자 정의 유형에 대한 표준 연산자를 구현하는 방법을 설명합니다.

 

Terminology

연산자에는 단항연산자(Unary operators), 이항연산자(Binary operators) 또는 삼항연산자(Ternary operators) 가 있습니다.

  • 단항 연산자는 단일 대상(예: -a)에서 사용합니다.                                                                                                                          단항 접두사 연산자는 대상 앞에 사용되고(예: !b) 단항 접미사 연산자는 대상 뒤에 작성합니다.(예: c!)
  • 이항 연산자는 두 개의 대상(예: 2 + 3)에서 사용하며 두대상 사이에 위치 하여야한다.
  • 삼항 연산자는 세 가지 대상에서 사용합니다. C와 마찬가지로 Swift는 삼항 연산자인 삼항 조건부 연산자(a ? b : c)만 있습니다.

연산자가 영향을 미치는 값은 피연산자(operands) 입니다. 표현식 1 + 2에서 + 기호는 이항 연산자이고 두 개의 피연산자는 1과 2입니다.

 

Assignment Operator

할당 연산자(a = b)는 b의 값을 a에 할당 해주거나 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가지 표준 산술 연산자를 지원합니다.

  • 덧셈(+)
  • 뺄셈(-)
  • 곱하기(*)
  • 나누기(/)
1 + 2       // equals 3
5 - 3       // equals 2
2 * 3       // equals 6
10.0 / 2.5  // equals 4.0

C 및 Objective-C의 산술 연산자와 달리 Swift 산술 연산자는 기본적으로 값이 오버플로되는 것을 허용하지 않습니다.

Swift의 오버플로 연산자(예: &+ b)를 사용하여 값 오버플로 동작을 선택할 수 있습니다. 오버플로 연산자를 참조하십시오.

 

더하기 연산자는 문자열 연결에도 사용 가능합니다.

"hello, " + "world"  // equals "hello, world"

Remainder Operator

나머지 연산자(a % b)는 내부에 들어갈 b의 배수의 수를 계산하고 남은 값(나머지라고 함)을 반환합니다.

a를 b로 나누고 남은 값 이라고 이해함.

Note
나머지 연산자(%)는 다른 언어에서 모듈로 연산자라고도 합니다. 
그러나 음수에 대한 Swift의 동작은 엄밀히 말하면 모듈 연산이 아닌 나머지라는 것을 의미합니다.

나머지 연산자가 작동하는 방식은 다음과 같습니다. 9 % 4를 계산하려면 먼저 9 안에 몇 개의 4가 들어갈 것인지 계산해야 합니다.

 

9 안에 4를 두 개 넣을 수 있고 나머지는 1입니다(주황색으로 표시).

Swift에서는 다음과 같이 작성됩니다.

9 % 4    // equals 1

% b에 대한 답을 결정하기 위해 % 연산자는 다음 방정식을 계산하고 나머지를 출력으로 반환합니다.

a = (b*곱해질 값) + 나머지

여기서 곱해질 값은 a를 b로 나누었을때 의 몫 이된다. 

a = 9, b = 4 라면 곱해질 값은 2, 나머지는 1이 된다. 9 = (4 x 2) + 1

 

음수 값에 대한 나머지를 계산할 때도 동일한 방법이 적용됩니다.

-9 % 4   // equals -1

방정식에 -9와 4를 대입하면 다음이 산출됩니다.

-9 = (4 x -2) + -1 

나머지는 -1 이 된다.

b의 음수 값에 대해서는 b의 부호가 무시되며 a % b 와 a % -b 의 값이 같다.

 

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

단항 더하기 연산자(+)는 단순히 연산이 수행되는 값을 반환합니다.

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

단항 더하기 연산자는 실제로 아무 작업도 수행하지 않지만 음수에 단항 빼기 연산자를 사용할 때 코드에서 양수에 대해 대칭을 제공하는 데 사용할 수 있습니다.

 

Compound Assignment Operators (복합 할당 연산자)

C와 마찬가지로 Swift는 할당(=)을 다른 연산과 결합하는 복합 할당 연산자를 제공합니다. 한 가지 예는 더하기 할당 연산자(+=)입니다.

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

a += 2 식은 a = a + 2의 약식입니다. 덧셈과 대입 두 작업을 동시에 수행하는 하나의 연산자로 결합하여 사용할수 있습니다.

Note
복합 할당 연산자는 값을 반환하지 않습니다. 예를 들어 let b = a += 2라고 쓸 수 없습니다.

 

Comparison Operators

Swift는 다음과 같은 비교 연산자를 지원합니다.

  • Equal to (a == b) (같음)
  • Not equal to (a != b) (같지 않음)
  • Greater than (a > b) (a가b보다 큼)
  • Less than (a < b) (a가b보다 작음)
  • Greater than or equal to (a >= b) (a가b보다 크거나 같음)
  • Less than or equal to (a <= b) (a가b보다 작거나 같음)
Note
Swift는 === , !== 라는 연산자도 제공하는데 두개의 객체참조가 동일한 객체 인스턴스를 참조하는지 
테스트하는 연산자 이다
자세한 사항은 Identity Operators 을 참조하라.

각 비교 연산자는 Bool 값을 반환하여 명령문이 참인지 거짓인지 나타냅니다.

1 == 1   // true because 1 is equal to 1
2 != 1   // true because 2 isn't equal to 1
2 > 1    // true because 2 is greater than 1
1 < 2    // true because 1 is less than 2
1 >= 1   // true because 1 is greater than or equal to 1
2 <= 1   // false because 2 isn't less than or equal to 1

비교 연산자는 if 문과 같은 조건문에서 자주 사용됩니다.

let name = "world"
if name == "world" {
    print("hello, world")
} else {
    print("I'm sorry \(name), but I don't recognize you")
}
// Prints "hello, world", because name is indeed equal to "world".

동일한 타입, 동일한 개수를 가진 튜플 형식을 비교할 수도 있으며 튜플을 비교할 땐 왼쪽에서 오른쪽으로 한 값씩 비교하게 된다.

(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"

 

위의 예시를 보면 1 보다 2가 크기때문에 값은 true 가 나오게되고 zebra 와 apple 는 비교할수없으나 값들 중 1개라도 비교할수있는 것이 있다면 비교하여 비교한 결과의 값을 반환하게 된다.

첫번째 값이 같다면 2번째값을 비교하게된다.

 

튜플은 해당 튜플의 각 값에 연산자를 적용할 수 있는 경우에만 주어진 연산자와 비교할 수 있습니다.

예를 들어, 아래 코드에서 볼 수 있듯이 String 및 Int 값 모두 < 연산자를 사용하여 비교할 수 있으므로 두 개의 유형(String, Int) 튜플을 비교할 수 있습니다.

반면에 두 개의 튜플(String, Bool) 유형은 Bool 값을  < 연산자를 이용해 비교할수 없기때문에 오류를 발생 시킨다.

("blue", -1) < ("purple", 1)        // OK, evaluates to true
("blue", false) < ("purple", true)  // Error because < can't compare Boolean values
Note
Swift 표준 라이브러리에는 요소가 7개 미만인 튜플에 대한 튜플 비교 연산자가 포함되어 있습니다. 
7개 이상의 요소가 있는 튜플을 비교하려면 비교 연산자를 직접 구현해야 합니다.

 

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

삼항 조건부 연산자는 질문 형식을 취하는 세 부분으로 된 특수 연산자입니다.질문? 답변1 : 답변2. 질문이 참인지 거짓인지에 따라 두가지 중 하나를 선택합니다. 질문이 true이면 answer1을 실행하고 값을 반환합니다. 그렇지 않으면 answer2를 실행하고 값을 반환합니다.

삼항 조건부 연산자는 아래 코드의 줄임말입니다.

if question {
    answer1
} else {
    answer2
}

다음 예시는 hasHeader (질문) 이 true, false 에따라 다르게 실행 하는 예시이다

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

hasHeader ? 50: 20이라는 연산을 수행하면 되는데 이때 hasHeader가 true이므로 50이 반환되어 rowHeight에는 90이 저장된다.
위의 예는 아래 코드의 줄임말입니다.

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

 

삼항 조건부 연산자를 사용하면 두번째 예제 보다 간결하게 작성할수있게 해주며 rowHeight 의값을 한줄의 코드로 작성하여 설정해줄수 있게된다.

그러나 삼항 조건 연산자는 주의해서 사용해야 한다. 과도하게 줄여 사용하면 읽기 어려운 코드가 될수 있다.

삼항 조건 연산자의 여러 인스턴스를 하나의 복합 문으로 결합하지 마십시오.

 

Nil-Coalescing Operator

nil-coalescing 연산자(a ?? b)는 a에 값이 포함된 경우 a를 언래핑 하고, a가 nil이면 b를 반환하라는 표현식 입니다.

b는 a의 타입과 일치해야 합니다.

이때 a는 옵셔널 타입이어야 합니다.

 

nil-coalescing 연산자는 아래 코드의 줄임말입니다.

a != nil ? a! : b

위의 코드는 삼항 조건부 연산자와 강제 래핑 해제(a!)를 사용하여 a가 nil이 아닐 때 a 의 언래핑된 값에 액세스합니다.

a가 nil 이라면 b를 반환합니다. nil-coalescing 연산자는 이 조건부 검사 및 래핑 해제를 간결하고 읽기 쉬운 형식으로 작성할수 있게 해줍니다.

 

예시는 nil-coalescing 연산자를 사용하여 값이 nil 이라면 defalutColorName 의 값을 반환 하라는 뜻이다.

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 은 String 옵셔널 타입으로 값을넣어주지 않았기 때문에 nil 이 된다.

값이 nil 이기 때문에  nil-coalescing 연산자 ?? 뒤에 작성된 defalutColorName 의 값이 반환되어colorNameToUse 에 할당 되게 된다.

 

userDefinedColorName에 nil이 아닌 값을 할당하고 nil-coalescing 연산자 검사를 다시 수행하면 userDefinedColorName 안에 언래핑된 값이 사용됩니다.

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

 

Range Operators (범위 연산자)

Swift에는 값의 범위를 표현하기 위해 범위 연산자를 제공 합니다.

Closed Range Operator

closed range operator 는 (a...b)처럼 표기하며  a에서b 까지 범위를 정의하고 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까지의 범위를 정의하지만 b는 포함하지 않습니다.

a 값은 포함하지만 b 값은 포함하지 않는다.

 closed range operatoa와 마찬가지로 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

배열에는 4개의 항목이 포함되어 있지만 0..<count는 반쯤 열린 범위이기 때문에 3번째 인덱스(배열의 마지막 항목 인덱스)까지만 계산됩니다.

 

One-Sided Ranges

한쪽 방향으로 커지거나 작아지거나 나타낼수있는 연산자이다.

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

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

1번 for 문에서 2... 은 names 의 2번 인덱스 이후 값에 접근하라는 뜻으로 이해할수있다.

2번 for 문에서 ...2 는 names 의 0 번인덱스부터 2번인덱스까지의 값들에 접근 한다 라는 뜻으로 이해할수있다.

half-open range operator와 같이 사용할수있다.

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

반복을 시작해야 하거나 종료시점의 위치가 명확하지 않기 때문에 다른곳에서 사용하게 되면 어디에서 시작해야 하는지, 어디에서 끝나는지에 대한 부분에 조건을 추가해주어야 한다.

아래 코드와 같이 단측 범위에 특정 값이 포함되어 있는지 여부도 확인할 수 있습니다.

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

 

Logical Operators (논리 연산자)

논리 연산자는 Bool 값 true 및 false를 반환한다.

Swift는 C 기반 언어에서 볼 수 있는 세 가지 표준 논리 연산자를 지원합니다.

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

Logical NOT Operator

logical Not Operator 는 (!a)처럼 표기하며 Bool 값을 반전하여 true가 false가 되고 false가 true가 되도록 합니다.
logical Not Operator 는 접두사 연산자이며 공백 없이 연산이 수행되는 값 바로 앞에 나타납니다. 다음 예에서 볼 수 있듯이 "not"으로 읽을 수 있습니다.
let allowedEntry = false
if !allowedEntry {
    print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"

if !allowedEntry 구문은 "false일 경우"로 읽을 수 있습니다.

다음 줄은 true인 경우에만 실행됩니다. 즉, allowedEntry가 false인 경우입니다.

예시 에서 와 같이 Bool 상수 및 변수 이름을 신중하게 작성하면 코드를 읽기 쉽고 간결하게 유지하면서 이중 부정이나 혼란스러운 논리 문장을 피하는 데 도움이 될 수 있습니다.

 

Logical AND Operator

logical And Operator 는(a && b)처럼 표기하며 참(true)이 되려면 왼쪽 오른쪽 두 값이 모두 참(true)이어야 하는 논리 표현식을 생성합니다.

두개의값 중 하나가 false이면 전체 표현식도 false가 됩니다. 첫 번째 값이 false이면 두 번째 값은 참인지 거짓인지 확인도 하지 않습니다.

이 예에서는 두 개의 Bool 값을 검사하고 두 값이 모두 true인 경우에만 실행 하게됩니다.
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"

 

Logical OR Operator

logical OR operator는 (a || b)처럼 표기하며 두 개의 값사이에 (||) 파이프 문자로 구성된 중위 연산자입니다.

이를 사용하여 전체 표현식이 참이 되려면 두 값 중 하나만 참이어야 하는 논리 표현식을 생성할 수 있습니다.

ogical And Operator 와 마찬가지로 첫번째 값이 참이라면 두번째 값은 참인지 거짓인지 확인하지 않습니다.

 

예시 에서 첫 번째 Bool 값(hasDoorKey)은 false이지만 두 번째 값(knowsOverridePassword)은 true입니다.

하나의 값이 true이므로 전체 표현식도 true로 평가되고 실행구문을 실행하게 됩니다.

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

 

Combining Logical Operators

여러 논리 연산자를 결합하여 더 긴 복합 표현식을 만들 수 있습니다.

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

예시 에서는 여러 && 및 || 연산자를 사용하여 더 긴 복합 표현식을 만듭니다.

그러나 && 및 || 연산자는 여전히 두 개의 값에서만 작동하므로 실제로는 함께 연결된 세 개의 작은 표현식입니다.

예제는 다음과 같이 읽을 수 있습니다.

 

enterDoorCode 가 참이고 passedRetinaScan 이 참이거나, hasDoorKey 가 참이거나 KnowsOverridePassword 가 참일경우

실행구문을 실행 하라.

조건이 거짓(false) 이라면 else 구문을 실행하게 된다.

연산 순서는 왼쪽부터 실행한다.

왼쪽부터 모든조건이 false이지만 맨오른쪽 || or 조건에서 KnowsOverridePassword 가 참(true) 이기때문에 

전체 표현식이 참(true)이 된다.

 

Explicit Parentheses

복잡한 표현의 의도를 읽기 쉽게 하기 위해 괄호를 포함하는 것이 때때로 유용합니다.

괄호를 사용할수 없는상황을 제외하고!

위의 예시 에서 복합 표현식의 첫 번째 부분 주위에 괄호를 추가하여 의도를 명확히 하는 것이 유용합니다.

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

괄호는 처음 두 값이 전체 논리에서 개별 상태로 나타낸다.

결과는 변경되지 않지만 독자가 보기에 코드를 작성한사람의 의도가 더 명확합니다.

가독성은 항상 간결함보다 우선합니다. 의도를 명확히 하는 데 도움이 되는 괄호를 사용하십시오.

 

Swift 공식문서

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 

The Basics — The Swift Programming Language (Swift 5.5)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

개발자 pingu 님의 블로그를 참고하여 작성하였습니다!

https://icksw.tistory.com/

 

PinguiOS

iOS 개발자가 되기 위해 iOS 공부, Swift 공부, CS 공부를 하고 있습니다.

icksw.tistory.com

'iOS > Swift-Documents' 카테고리의 다른 글

Swift 5.5 Functions -6  (0) 2022.02.04
Swift 5.5 Control Flow -5  (0) 2022.01.27
Swift 5.5 Collection Types -4  (0) 2022.01.27
Swift 5.5 Strings and Characters -3  (0) 2022.01.25
swift5.5 공식문서 The Basics -1  (0) 2022.01.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함