https://youtu.be/R8OWOgCNt4M?si=bldau6gYEZ3seGj2
위 영상을 보고 정리한 글입니다. (11:41 ~ 16:22)
# 연산자
연산자의 종류는 매우 다양한데, 그 중 교수님께서 중요하다고 짚어주신 부분을 위주로 살펴보자.
1. 산술 연산자
2. 복합 할당 연산자
3. 증가 연산자와 감소 연산자
- 단항 연산자
- x의 값을 1 증감
x++, x--는 Swift 3에서 없어진 문법임.x = x + 1 // x 변수의 값을 1 증가시킴 x = x - 1 // x 변수의 값을 1 감소시킴 x++ // x += 1 x-- // x -= 1
4. 비교 연산자
5. 불리언 논리 연산
6. 범위 연산자
- 닫힌 범위 연산자 (closed range operator)
x...y // x에서 시작하여 y로 끝나는 범위에 포함된 숫자 5...8 // 5, 6, 7, 8
- 반 열린 범위 연산 (half-open range operator)
x..<y // x에서 시작하여 y가 포함되지 않는 모든 숫자 5..<8 // 5, 6, 7
- One-Sided Ranges
let names = ["A", "B", "C", "D"] for name in names[2...] { //[...2], [..<2] print(name) } // C // D
7. 삼항 연산자 ?:
8. Nil-Coalescing Operator (Nil 합병 연산자)
- 옵셔널 변수 ?? nil일 때 할당되는 값
- 옵셔널 변수의 값이 nil이 아니면 옵셔널이 풀린 값으로 할당됨
- 옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨
let defaultColor = "black"
var userDefinedColor : String? // 초기값이 nil
var myColor = userDefinedColor ?? defaultColor
// userDefinedColor가 nil이 아니면 옵셔널이 풀려서 myColor에 할당
// nil이므로 defaultColor인 black으로 할당됨
print(myColor) // black
userDefinedColor = "red"
myColor = userDefinedColor ?? defaultColor
// nil이 아니므로 userDefinedColor의 옵셔널이 풀린 원래 값인 red가 할당됨
print(myColor) // red
// 주의 : optional(red)가 아님
9. 비트 NOT 연산자
10. 비트 AND 연산자
11. 비트 OR 연산자
12. 비트 XOR 연산자
13. 비트 왼쪽 시프트 연산자
14. 비트 오른쪽 시프트 연산자
15. 복합 비트 연산자
# 제어문
for 문
1. 조건-증가(condition-increment) for문
- Swift 3에서 없어진 문법
- for 초기화; 조건식; 증감식 {
// 실행될 구문
}
for var i = 0; i < 10; i += 1 { // for i in 0..<10 로 수정해야 함
print("Value of i ia \(i)")
}
2. for-in 반복문
- 컬렉션 또는 숫자 범위 내에 있는 목록들을 반복
- for 상수명 in 컬렉션 또는 범위 {
// 실행될 코드
} - '상수명'은 반복문이 돌면서 컬렉션 또는 범위에서 가져온 항목을 담게 될 상수
일반적으로 반복문의 몸체에 있는 코드는 반복문을 통해 가져온 현재 항목의 참조체로 상수명 사용 - '컬렉션 또는 범위'는 반복문이 반복되면서 현재의 항목을 참조
문자열 값들의 배열이거나 범위 연산, 또는 문자들로 구성된 문자열일 수 있음
for index in 1...5 {
print("Value of index is \(index)")
}
- index하는 이름의 상수에 현재 항목이 할당되면서 시작
- for 반복문이 숫자 1부터 시작하여 5로 끝난다는 것을 가리키는 닫힌 범위 연산자를 선언하고 있음
- _로 참조체(i) 생략 가능
for _ in 1...5 {
print("안녕")
}
for i in 1...5 {
print("\(i) 안녕")
}
- 배열의 항목 접근
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
print(name)
}
// Anna
// Alex
// Brian
// Jack
- dictionary의 항목 접근
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
// dictionary는 key:value 형식의 배열
for (animalName, legCount) in numberOfLegs {
print("\(animalName)s have\(legCount) legs")
}
// spiders have 8 legs
// ants have 5 legs
// cats have 4 legs
while 반복문
- for 반복문 : 몇 번 정도 반복해야 할지를 이미 아는 경우
- while 반복문 : 어떠한 조건이 되기 전에 몇 번 정도 반복해야 할지를 알 수는 없지만 그 조건을 반복해야 하는 경우
- 기본적으로 while 반복문은 지정된 조건을 만족할 때까지 작업을 반복
- while 조건식 {
// Swift 코드가 위치
} - '조건식'은 참(true) 또는 거짓(false)을 반환하게 되는 표현식
- 주석 부분은 조건식이 참인 동안에 실행될 코드
- myCount 변수가 100보다 크지 않을 때까지 반복, 100이 되는 시점에서 반복문 종료
var myCount = 0
while myCount < 100 {
myCount+=1 // myCount가 100이 될 때까지 myCount의 값에 1을 더함
}
print(myCount) // 루프가 종료된 후 myCount의 최종 값(100)을 출력
repeat ... while 반복문
- swift 1.x의 do ... while 반복문을 대신하는 반복문
- repeat ... while 반복문의 몸체는 적어도 한 번은 실행
- repeat {
//
} while 조건식
var i = 10
repeat {
i = i - 1
print(i)
} while (i > 0)
// 2
// 1
// 0
반복문에서 빠져나오기 : break 문
- 반복문을 생성했다면 반복문이 완료되는 조건에 다다르기 전에 반복문을 빠져나오는 어떤 조건을 만들 수도 있음
특히 무한 루프를 생성할 경우 - 현재의 반복문에서 빠져나와서 반복문 바로 다음에 있는 코드를 실행
- j의 값이 100을 넘을 때까지 계속 수행할 것이며, 100을 넘으면 반복문이 종료되고 반복문 밑에 있는 코드를 실행
var j = 10
for i in 1..<100 { // i는 1부터 99까지의 범위를 설정. 이 범위 내에서 루프 반복
j += j // 매 반복마다 j의 값을 두 배로 증가시킴
if j > 100 { // j의 값이 100을 초과하는 경우
break // break 문이 실행되어 루프 종료
}
print("j = \(j)") // 루프 종료 전에 j의 현재 값 출력
}
// j = 20
// j = 40
// j = 80
- 사실상 위의 코드에서 i의 값이 필요하지 않으므로, i를 생략하고 _를 사용할 수 있음.
이는 i가 사용되지 않음을 명시적으로 나타낼 수 있음
for _ in 1..<100 {
- 위의 코드에서 break 문을 변형하여 실행하면 어떻게 될까?
var j = 10 for i in 1..<100 { j += j if j > 100 break print("j = \(j)") }
- 위 코드를 실행하면 에러가 발생한다.
main.swift:4:16: error: expected '{' after 'if' condition - 에러의 원인은 break 문을 { } 로 감싸지 않았기 때문이다.
- break 문은 조건이 참일 때 루프를 종료하라는 지시이므로, 반드시 { }로 감싸야 한다.
continue 문
- continue 문은 반복문에서 continue 문 이후의 모든 코드를 건너뛰고 반복문 상단 시작 위치로 돌아감
var i = 1
while i < 20 {
i += 1
if (i % 2) != 0 {
continue
}
print("i = \(i)")
}
- 변수 i의 값이 짝수일 때만 print 함수 호출
- continue 문은 i의 값을 2로 나눈 나머지가 있으면 print 함수가 호출하는 코드를 건너뜀 (출력 X)
- continue 문이 실행되면 while 반복문의 상단으로 이동하고 반복문 다시 실행
if 문 사용하기
- if 불리언 표현식 {
// 불리언 표현식이 참일 경우 수행될 스위프트 코드
} - Swift에서는 if 문 다음의 실행 코드가 한 줄이라도 괄호({})를 필수적으로 사용해야 함
- 기본적으로 '불리언 표현식'이 참(true)으로 판단되면 괄호로 감싸인 코드 실행
- '불리언 표현식'이 거짓(false)이면 괄호로 감싸인 코드는 건너뜀
var x = 10
if x > 9 {
print("x is greater than 9!")
}
// 주의 error: expected '{' after 'if' condition
guard 문 (조건식이 거짓이면 실행)
- guard 문은 Swift 2 에 도입된 구문
- 표현식이 거짓(false)로 판단될 경우에 수행될 else 절을 반드시 포함해야 함
elsel 절에 속한 코드는 현재의 코드 흐름을 빠져 나갈 수 있는 구문 (return, break, continue, throw 구문)을 반드시 포함해야 함
또는 다른 함수를 else 코드 블록 안에서 호출할 수도 있음 - guard <불리언 표현식> else {
// 표현식이 거짓일 경우에 실행될 코드
<코드 블록을 빠져 나갈 구문>
}
// 표현식이 참일 경우에 실행되는 코드 - 기본적으로 특정 조건에 맞지 않을 경우에 현재의 함수나 반복문에서 빠져 나갈 수 있도록 하는 '조기 출구(early exit)' 전략 제공
- if 문 vs guard 문
// if 문
var index: Int?
index = 3
var treeArray = ["Oak", "Pine", "Yew", "Birch"]
if let myvalue = index { // 옵셔널 변수 값을 상수 myvalue에 대입
print(treeArray[myvalue])
} else {
print("index does not contain a value") // 여기에서 index 못 씀
}
// guard 문
func multiplybyten(value: Int?) {
guard let number = value, number < 10 else { // 조건식이 참일 때 실행
print("수가 10보다 크다")
return
}
print(number*10) // 조건식이 참일 떄 실행, 주의 : number 여기서도 사용 가능
}
multiplyByTen(value: 3) // 30
- guard 문은 값을 언래핑(unwrap)하기 위해서 옵셔널 바인딩을 이요하며, 그 값이 10보다 작은지 검사
- 변수를 언래핑 할 수 없거나 그 값이 10보다 크면, else 절이 실행되어 에러 메시지가 출력되며, 이 함수에서 빠져 나가도록 return 문이 실행
- 10 보다 작은 값이면, guard 문 아래에 있는 코드가 실행되어 그 값에 10이 곱해진 값이 출력됨 - 언래핑된 number 변수를 guard 문 밖에 있는 코드가 사용할 수 있음
- if 문을 이용해 언래핑된 변수는 if 문 밖에 있는 코드가 사용 불가
switch 문
switch 표현식
{
case match1:
구문
case match2:
구문
case match3, match4:
구문
default:
구문
}
'표현식'은 값 또는 값을 반환하는 표현식을 나타낸다.
각각의 가능한 경우마다 case 문 필요하며 해당하는 일치 값(match)을 다음에 쓴다.
각각의 case 문은 표현식을 처리한 결과와 동일한 데이터 타입이어야 한다.
case 문 다음에는 해당 case 문과 일치했을 때 실행되는 Swift 구문을 쓴다.
마지막 default 문은 표현식과 일치하는 case 문이 없을 경우를 위한 것이다.
var value = 4
switch (value)
{
case 0:
print("zero")
case 1:
print("one")
case 2:
print("two")
case 3:
print("three")
case 4:
print("four")
case 5:
print("five")
default
print("integer out of range")
}
case 문 결합하기
위의 예제에서 각각의 case 문은 각자의 실행할 구문을 가진다.
때때로 여러 가지 서로 다른 경우에 대해서 동일한 코드를 실행해야 할 경우가 있다.
이런 경우, 실행될 공통 코드로 그룹 case 문을 만들 수 있다.
위의 예제를 수정하여 값이 0, 1, 또는 2일 경우에 동일한 코드가 실행되도록 할 수 있다.
var value = 1
switch (value)
{
case 0, 1, 2:
print("zero, one or two")
case 3:
print("three")
case 4:
print("four")
case 5:
print("five")
default:
print("Integer out of range")
}
switch 문에서의 매칭 범위
switch 문에 있는 case 문은 매칭 범위를 구현하도록 할 수도 있음
예를 들어, 다음의 switch 문은 세 개의 숫자 범위로 온도 값을 검사하고 있음
var temperature = 83
switch (temperature)
{
case 0...49: // 0~49
print("Cold")
case 50...79:
print("Warm")
case 80...110:
print("Hot")
default:
print("Temperature out of range")
}
where 문 사용하기
where 문은 switch case에 부가적인 조건을 추가하기 위하여 사용될 수 있음
값이 속하는 범위 뿐만 아니라 그 숫자가 홀수인지 짝수인지도 검사함
var temperature = 54
switch (temperature)
{
case 0...49 where temperature % 2 == 0:
print("Cold and even")
case 50...79 where temperature % 2 == 0:
print("Warm and even")
case 80...110 where temperature % 2 == 0:
print("Hot and even")
default:
print("Temperature out of range or odd")
}
fallthrough
다른 언어들과는 다르게 Swift 언어는 일치하는 case 문을 만나면 자동으로 빠져나오기 때문에
case 문 다음에 break 문을 포함할 필요가 없다.
case 별로 빠져나가지 않고 아래로 계속 내려가게 하려면 fallthrough 문을 사용한다.
var temperature = 10
switch (temperature)
{
case 0...49 where temperature % 2 == 0:
print("Cold and even")
fallthrough
case 50...79 where temperature % 2 == 0:
print("Warm and even")
fallthrough
case 80...110 where temperature % 2 == 0:
print("Hot and even")
fallthrough
default:
print("Temperature out of range or odd")
}
Swift switch 구문에서는 보통 break 문이 사용되지 않지만, default case에서 해야 할 작업이 없을 경우에는 break 문이 유용하다.
...
default:
break
}
다음 글에서는 함수와 메서드(method), 클로저(closer)에 대해 다뤄보겠다.
'iOS프로그래밍기초(Smile Han) > 문법 정리' 카테고리의 다른 글
[Swift] 문법 정리 - 상속 (3) | 2024.11.10 |
---|---|
[Swift] 문법 정리 - 클래스 (0) | 2024.11.10 |
[Swift] 문법 정리 - 함수, 메서드(method) (1) | 2024.10.06 |
[Swift] 문법 정리 - optional, as, nil, Any, AnyObject (1) | 2024.09.15 |
[Swift] 문법 정리 - 데이터 타입(자료형), 상수(let), 변수(var), 튜플(Tuple) (0) | 2024.09.14 |