6.1 조건문
조건문은 어떠한 값이 특정 조건에 해당할 때만 선택적으로 코드를 실행시켜준다.
대표적으로 if-else 문과 switch-case 문이 있다.
6.1.1 if 구문
- 값이 if 조건에 맞아 떨어지면 if의 코드가 실행된다.
- 만약 else if 문이 있다면 if 후에 순서대로 조건을 비교한다.
- 끝까지 맞는 조건이 없다면 else 구문이 실행된다.
- else if 와 else 구문은 생략할 수 있다.
let first: Int = 5
let second: Int = 5
var biggerValue: Int = 0
if first > second {
biggerValue = first
} else if first == secocnd {
biggerValue = first
} else if (first < second) { // 조건 수식을 소괄호로 묶어주는 것은 선택 사항이다.
biggerValue = second
} else if (first == 5) {
// 조건을 충족하더라도 이미 first == second라는 조건을 충족하여 위에서 실행 됨.
// 따라서 이 조건은 실행되지 않는다.
biggerValue = 100
} else {
// 마지막 else는 생략 가능하다. 물론 else if도 생략이 가능하다.
// 즉, else나 else if 없이 if만 단독으로 사용할 수도 있다.
biggerValue = 0
}
print(biggerValue) // 5
6.1.2 switch 구문
기본 문법이라 할 수 있는 switch 구문은 다른 언어와 비교했을 때 많이 달라진 문법 중 하나이다.
- break 키워드 사용은 선택 사항이다. 즉, case 내부의 코드를 모두 실행하면 break 없이도 switch 구문이 종료된다.
- C 언어와 다르게 Swift의 switch는 구문의 조건에 다양한 값이 들어갈 수 있다. 다만 비교 값은 입력 값과 타입이 같아야 한다.
- 비교될 값이 명확히 한정적인 값이 아닐 때는 default를 꼭 작성해줘야 한다.
- 각 case에는 범위 연산자를 사용할 수도, where 절을 사용하여 조건을 확장할 수도 있다.
- fallthrough 키워드를 사용하면 전의 case에서 조건이 맞아 switch 구문이 종료되는 대신 다음 case를 이어서 연속 실행한다.
switch 입력 값 {
case 비교 값 1:
실행 구문
case 비교 값 2:
실행 구문
// 이번 case를 마치고 switch 구문을 탈출하지 않고 아래 case로 넘어간다.
fallthrough
case 비교 값 3, 비교 값 4, 비교 값 5: // 한 번에 여러 값과 비교할 수 있다.
실행 구문
break // break 키워드를 통한 종료는 선택 사항이다.
default: // 한정된 범위가 명확지 않다면 default는 필수이다.
실행 구문
}
fallthrough와 break 사용 예시 (열거형 사용)
enum HoonType {
case hoonsbrand
case hoon
case hoonsbrandTistory
var name: String {
switch self {
case .hoonsbrand:
return "Hoonsbrand"
case .hoon:
return "Hoon"
case .hoonsbrandTistory:
return "HoonsbrandTistory"
}
}
}
var hoonType: HoonType = .hoonsbrand
switch hoonType {
/* 열거형과 같이 한정된 범위의 값을 입력 값으로 받게 될 때 값에 대응하는 각 case를 구현한다면
default를 구현하지 않아도 된다. */
case .hoonsbrand:
print("\n 원래는 여기까지만 출력이 되지만,")
print("My name is \(hoonType.name)")
fallthrough
case .hoon:
print("\n fallthrough를 사용하면 여기도,")
fallthrough // 아래의 문구는 출력되지 않고 다음 case 문으로 이동한다.
print("My name is \(hoonType.name)")
case .hoonsbrandTistory:
print("\n 또 여기도 출력된다.")
break // 아래의 문구는 출력되지 않는다.
print("My name is \(hoonType.name)")
}
/* 타입 case는 .hoonsbrand이다.
해당 변수를 switch문에 조건으로 넣으면 case .hoonsbrand: 문만 거친 뒤 빠저나가는 것이 정상이다.
하지만 fallthrough문을 사용하면 이어서 그 다음 case문의 코드까지 실행하게 된다. */
default 사용 예시
// 부동소수 타입의 범위 연산 switch case 구성
let doubleValue: Double = 3.0
switch doubleValue {
case 0:
print("Value == zero")
case 1.5...10.5:
print("1.5 <= Value <= 10.5")
default:
print("Value == \(doubleValue)")
}
// 1.5 <= Value <= 10.5
// 두번째 case의 조건을 충족해서 default 구문은 실행되지 않는다.
// 문자열 switch case 구성
let stringValue: String = "Hoonsbrand"
switch stringValue {
case "Jin":
print("He is Jin")
case "Jay":
print("He is Jay")
case "Noel, Tom, Amy":
print("He or She is \(stringValue)")
default:
print("\(stringValue) said 'I don't know who you are'")
}
// Hoonsbrand said 'I don't know who you are'
와일드카드 식별자를 사용한 튜플 switch case 구성
typealias NameAge = (name: String, age: Int)
let tupleValue: NameAge = ("hoonsbrand", 50)
switch tupleValue {
case ("hoonsbrand", 25):
print("정확히 맞췄습니다!")
case ("hoonsbrand", _):
print("이름만 맞았습니다. 나이는 \(tupleValue.age)입니다.")
case (_, 25):
print("나이만 맞았습니다. 이름은 \(tupleValue.name)입니다.")
default:
print("누굴 찾나요?")
}
// 이름만 맞았습니다. 나이는 50입니다.
값 바인딩을 사용한 튜플 switch case 구성
typealias NameAge = (name: String, age: Int)
let tupleValue: NameAge = ("hoonsbrand", 50)
switch tupleValue {
case ("hoonsbrand", 25):
print("정확히 맞췄습니다!")
case ("hoonsbrand", let age):
print("이름만 맞았습니다. 나이는 \(age)입니다.")
case (let name, 25):
print("나이만 맞았습니다. 이름은 \(name)입니다.")
default:
print("누굴 찾나요?")
}
// 이름만 맞았습니다. 나이는 50입니다.
where를 사용하여 switch case 확장
let 직급: String = "사원"
let 연차: Int = 1
let 인턴인가: Bool = false
switch 직급 {
case "사원" where 인턴인가 == true:
print("인턴입니다.")
case "사원" where 연차 < 2 && 인턴인가 == false:
print("신입사원입니다.")
case "사원" where 연차 > 5:
print("연식 좀 된 사원입니다.")
case "사원":
print("사원입니다.")
case "대리":
print("대리입니다.")
default:
print("사장입니까?")
}
// 신입사원입니다.
6.2 반복문
조건에 따라 실행되어야 하는 명령어를 조건문을 통해 분기한다면, 같거나 비슷한 명령을 반복 실행할 때는 반복문만큼 중요한 것이 없다.
특히나 배열과 같은 시퀀스(Sequence), 순서가 있는 데이터는 반복문으로 더욱 편리하게 처리할 수 있다.
continue, break 등의 제어 키워드 사용이 가능하다.
Swift의 반복문은 기존 프로그래밍 언어의 반복문과 크게 다르지 않다.
다만 전통적인 C 스타일의 for 구문이 사라졌다는 것과 조건에 괄호를 생략할 수 있다는 정도이다.
또한 do-while 구문은 Swift에서는 repeat-while 구문으로 구현되어 있다.
6.2.1 for in 구문
for-in 반복 구문은 반복적인 데이터나 시퀀스를 다룰 때 많이 사용한다.
for 임시 상수 in 시퀀스 아이템 {
실행 코드
}
기본 데이터 타입의 for-in 반복 구문 사용
// Dictionary
let friends: [String: Int] = ["Jay": 35, "Joe": 29, "Jenny": 31]
for tuple in friends {
print(tuple)
}
// ("Joe", 29)
// ("Jay", 35)
// ("Jenny", 31)
// Set
let 지역번호: Set<String> = ["02", "031", "032", "033", "041", "042", "043", "044",
"051", "052", "053", "054", "055", "061", "062", "063", "064"]
for 번호 in 지역번호 {
print(번호)
}
// 02
// 031
// 032
// ...
6.2.2 while 구문
while 반복 구문도 다른 프로그래밍 언어의 while 구문과 크게 다르지 않다.
특정 조건(Bool 타입으로 지정되어야 함)이 성립하는 한 블록 내부의 코드를 반복해서 실행한다.
var names: [String] = ["Hoonsbrand", "Steve", "Noel"]
while names.isEmpty == false {
print("Good bye \(names.removeFirst())")
// removeFirst()는 요소를 삭제함과 동시에 삭제한 요소를 반환한다.
}
// Good bye Hoonsbrand
// Good bye Steve
// Good bye Noel
6.2.3 repeat-while 구문
repeat-while 반복 구문은 다른 프로그래밍 언어의 do-while 구문과 크게 다르지 않다.
repeat 블록의 코드를 최초 1회 실행한 후, while 다음의 조건이 성립하면 블록 내부의 코드를 반복 실행한다.
var names: [String] = ["Hoonsbrand", "Steve", "Noel"]
repeat {
print("Good bye \(names.removeFirst())")
} while names.isEmpty == false
// Good bye Hoonsbrand
// Good bye Steve
// Good bye Noel
6.3 구문 이름표
반복문을 작성하다 보면 종종 반복문을 중첩으로 작성하게 된다. 이때 반복문을 제어하는 키워드(break, continue 등)가 어떤 범위에 적용되어야 하는지 애매하거나 큰 범위의 반복문을 종료하고 싶은데 작은 범위의 반복문만 종료되는 등 예상치 못한 실수를 할 수도 있다.
그럴 때는 반복문 앞에 이름과 함께 콜론을 붙여 구문의 이름을 지정해주는 구문 이름표를 사용하면 좋다.
var numbers: [Int] = [3, 2342, 6, 3252]
numbersLoop: for num in numbers {
if num > 5 || num < 1 {
continue numbersLoop
}
var count: Int = 0
printLoop: while true {
print(num)
count += 1
if count == num {
break printLoop
}
}
removeLoop: while true {
if numbers.first != num {
break numbersLoop
}
numbers.removeFirst()
}
}
// 3
// 3
// 3
// numbers에는 [2342, 6, 2352]가 남는다.
해당 게시글은 야곰님의 "스위프트 프로그래밍 3판"을 참고하여 작성하였습니다.
스위프트 프로그래밍(3판): 객체지향, 함수형, 프로토콜 지향 패러다임까지 한 번 ... - 야곰 - Google 도서
'Swift' 카테고리의 다른 글
Swift) ch8.옵셔널 (0) | 2022.06.29 |
---|---|
Swift) ch7.함수 (0) | 2022.06.27 |
Swift) ch5.연산자 (0) | 2022.06.22 |
Swift) ch4.데이터 타입 고급 (0) | 2022.06.19 |
Swift) ch3.스위프트 처음 시작하기 (0) | 2022.06.15 |
댓글