1. 조건문
조건문의 개념
어떠한 값이 특정 조건에 해당할 때만 선택적으로 코드를 실행
if-else
if 조건 {
//조건이 만족되면 실행
} else {
//조건이 만족되지 않으면 실행
}
var a : String = "철수"
var b : String = "짱구"
var c : String = "맹구"
if a == "철수" {
print("정답!")
}
else {
print("a는 \\(a)입니다.")
}
if b == "유리" {
print("정답!")
}
else {
print("b는 \\(b)입니다.")
}
// 정답!
// b는 짱구입니다.
var age : Int = 19
var student : String = ""
if age >= 8 && age < 14 {
student = "초등학생"
} else if age < 17 {
student = "중학생"
} else if age < 20 {
student = "고등학생"
} else {
student = "기타"
}
- else if 를 사용하면 다중 제어 가능
switch-case
switch 비교값 {
case 패턴:
/*실행구문*/
default: //else if 같은 개념
/*실행구문*/
}
switch value
{
case value1:
respond to value 1
case value2,
value3:
respond to value 2 or 3
default:
otherwise, do something else
}
switch weather {
case "rain":
print("Bring an umbrella")
case "snow":
print("Wrap up warm")
case "sunny":
print("Wear sunscreen")
fallthrough
default:
print("Enjoy your day!")
}
//Wear sunscreen
//Enjoy your day!
- 패턴 비교문
- 가장 첫 번째 매칭되는 패턴의 구문 실행
- switch문의 입력 값으로 숫자 표현이 아닌 문자, 문자열, 열거형, 튜플, 범위, 패턴이 적용된 타입 등 다양한 타입의 값도 사용 가능함.
- 각 상태는 키워드 case를 통해 나타낼 수 있음
- case 내부의 코드를 모두 실행하면 break 없이도 구문이 종료
- case는 원하는 만큼 여러 번 작성 가능
- 잘못된 case 사용
let stringValue: String = "아카데미" switch stringValue { case "애플": print("안녕하세요 애플입니다.") case "삼성": //실행될 코드가 없기 때문에 오류 발생 default: print("안녕하세요 \\(stringValue)에 찾아와주셔서 감사드립니다") } // 안녕하세요 아카데미에 찾아와주셔서 감사드립니다 ⬇️ let stringValue: String = "아카데미" switch stringValue { case "애플": fallthrough case "삼성": fallthrough case "하울": fallthrough case "포뇨", "소피아", "캘시퍼": print("안녕하세요. \(stringValue)") default: print("안녕하세요 \(stringValue)에 찾아와주셔서 감사드립니다") } // 안녕하세요 아카데미에 찾아와주셔서 감사드립니다
- 위 case 블럭의 "포뇨", "소피아", "캘시퍼": 처럼 여러 개의 항목을 한 번에 case 로 지정해주는 것도 가능
- 여러 항목을 나타내기 위해 case를 연달아 쓰는 것은 불가능
- case XXX:다음에는 꼭 실행 가능한 코드가 위치해야 함
- switch문의 모든 경우를 커버하기 위해서는 마지막에 default 키워드를 사용해야 함
- 매우 한정적인 값 (enum, case 등)이 비교 값이 아닌 한 default 구문은 반드시 작성해야 함
- 단, default 키워드 없이도 모든 경우가 커버 되었다면, default 키워드가 없어도 됨.
- switch문의 case를 연속 실행 → fallthrough 키워드 사용
- fallthrough는 원하는 만큼 여러 번 사용 가능
- Interval Matching
- 범위 연산자를 활용해, 단순히 값을 매칭하는 것을 넘어 다양한 패턴을 통해 매칭
func interSwitch(count:Int) { let countedThings = "moons orbiting Saturn" let naturalCount: String switch count { case 0: naturalCount = "no" case 1..<5: naturalCount = "a few" case 5..<12: naturalCount = "several" case 12..<100: naturalCount = "dozens of" case 100..<1000: naturalCount = "hundreds of" default: naturalCount = "many" } print("There are \\(naturalCount) \\(countedThings).") }
- 범위 연산자를 활용해, 단순히 값을 매칭하는 것을 넘어 다양한 패턴을 통해 매칭
- where키워드를 사용하여 case의 조건을 확장할 수 있음
let IceCream: String = "비비빅"
let price: Int = 400
let isDelicious: Bool = false
switch IceCream {
case "비비빅" where isDelicious == true:
print("아주 맛있다!")
case "비비빅" where price < 1000 && isDelicious == false:
print("\\(IceCream)...? 제가 별로 싫어하는것을 사오셨네요..")
case "비비빅" where price > 200:
print("와 엄청 싸다!")
case "메로나":
print("메로나")
default:
print("맛이 없네요...")
}
// 비비빅...? 제가 별로 싫어하는것을 사오셨네요..
- 열거형에 case가 추가될 가능성이 있다면 unknown이라는 속성을 사용하여 대처할 수 있음
- 열거형에 정의한 모든 case를 처리해주면 정상적으로 컴파일되겠지만, 나중에 열거형에 case를 추가한다면 기존의 switch문은 컴파일 오류가 발생 → switch문이 모든 case에 대해 대비하지 못하기 때문
enum Menu {
case Pizza
case Chicken
}
let lunchMenu: Menu = .Pizza
switch lunchMenu {
case .Chicken:
print("양념치킨")
case .Pizza:
print("도미노피자!")
case _: // default와 같은 표현
print("치킨소스 추가해주세요")
}
//도미노피자!
switch ↔ if
let chr = "a"
if chr == "a" {
print("캐릭터는 a 입니다.")
}
else if chr == "b" {
print("캐릭터는 b 입니다.")
}
//캐릭터는 a 입니다.
let chr = "a" //"b" 로 바꾸면 결과값은 "이것은 b 입니다."로 바뀜
switch chr {
case "a" :
print("이것은 a 입니다.")
case "b" :
print("이것은 b 입니다.")
default:
print("아무것도 선택되지 않았습니다.")
}
//이것은 a 입니다.
func loveCalculator() {
let loveScore = Int.random(in: 0...100)
if loveScore > 80 {
print("당신은 서로 많이 사랑합니다.")
} if loveScore > 40 && loveScore <= 80 {
print("당신은 썸을 타고 있습니다.")
} else {
print("당신은 평생 혼자입니다..")
}
}
loveCalculator()
func loveCalculator() {
let loveScore = Int.random(in: 0...100)
switch loveScore {
case 81..100:
print("당신은 서로 많이 사랑합니다.")
case 41..<81:
print("당신은 썸을 타고 있습니다.")
case ...40:
print("당신은 평생 혼자입니다..")
default:
print("다시 실행해주세요")
❓ 언제 if 대신 switch를 사용할까?
- switch문은 변수를 입력받아 미리 정해놓은 여러 값들과의 일치 여부를 판단하여 switch문 내의 control flow를 결정
- if문은 불리언의 결과 값을 내놓는 조건문에 따라 true, false에 해당하는 각각 두 개의 흐름으로 갈라짐
- if문을 중첩되게 배치하면, 두 개의 흐름뿐만 아니라 세 개, 네 개 등등.. 그 이상의 control flow을 가질 수 있게 됨.
- (if / else if / else와 같은 방식)
- if문을 쓸 수 있는 모든 상황에 switch문을 쓸 수 있는 건 아니지만, 반대로 모든 switch문은 if문으로 대체될 수 있음
→ 하나의 변수를 입력받아 그 변수의 값에 따라 다른 흐름으로 이동할 수 있는 코드를 짜야할 때에 switch문과 if문이 둘 다 사용될 수 있음
→ switch문을 사용하는 것이 좋음
2. 반복문
반복문의 개념
반복문이란 특정 조건에 따라 코드 블록을 반복적으로 실행할 수 있도록 하는 제어 구조
for 반복문
- for 반복문은 특정한 횟수만큼 코드 블록을 실행하고자 할 때 사용
for index in 1...5 {
print(index)
}
// 1
// 2
// 3
// 4
// 5
let array = [1, 2, 3, 4, 5]
for element in array {
print(element)
}
// 1
// 2
// 3
// 4
// 5
- 언제 사용하나요?
- 보통 어느 횟수만큼 반복문을 실행하고 싶은지 아는 경우
- 배열이나 딕셔너리와 같은 컬렉션에 대해 반복해야 하는 경우
- 컬렉션의 각 요소에 대해 특정 작업을 수행해야 하는 경우
- 장점
- 특정 횟수 동안 혹은 컬렉션의 각 요소에 대해 코드 블록을 실행할 수 있는 편리한 방법 제공
- 컬렉션 반복과 관련하여 반복되는 코드를 작성하는 것을 방지할 수 있음
While 반복문
- While 반복문은 특정 조건이 참일 때까지 코드 블록을 실행하고자 할 때 사용
var count = 0
while count < 5 {
print(count)
count += 1
}
// 0
// 1
// 2
// 3
// 4
- 언제 사용하나요?
- 보통 어느 횟수만큼 반복문을 실행하고 싶은지 모르는 경우
- 특정 조건이 충족될 때까지 특정 작업을 수행해야 하는 경우
- 장점
- 반복을 몇 번 실행해야 하는지 모를 때 유용함
- 모든 요소에 대해 반복할 필요가 없는 경우 코드를 작성하지 않고 컬렉션을 반복할 수 있음
let numbers = [1, 3, 6, 7, 9, 10, 12]
var index = 0
var firstEvenNumber: Int?
while index < numbers.count && firstEvenNumber == nil {
let number = numbers[index]
if number % 2 == 0 {
firstEvenNumber = number
}
index += 1
}
if let evenNumber = firstEvenNumber {
print("The first even number in the array is \\(evenNumber).")
} else {
print("There are no even numbers in the array.")
}
Repeat-While 반복문
- Repeat-While 반복문은 While 반복문과 유사하지만, 조건을 확인하기 전에 적어도 한 번은 코드 블록을 실행
var count = 0
repeat {
print(count)
count += 1
} while count < 5
// 0
// 1
// 2
// 3
// 4
- 언제 사용하나요?
- 조건을 확인하기 전에 코드 블록을 한 번 이상 실행해야 하는 경우
- 특정 조건이 충족될 때까지 특정 작업을 수행해야 하는 경우
- 장점
- 반복문 내부의 코드 블록이 조건에 관계없이 적어도 한 번은 실행되는 것을 보장함
💡 반복문 정리
[For 반복문]
- 반복문을 실행하기 전 반복 횟수를 알 수 있음
- 범위 혹은 배열과 같은 시퀀스를 통해 반복
- 반복할 때마다 루프 변수가 자동으로 증가/감소
- 시퀀스가 비어있다면 반복문이 전혀 실행되지 않을 수 있음
[While 반복문]
- 반복문을 실행하기 전 반복 횟수를 알 수 없음
- 조건이 참인 동안 반복문 실행
- 조건은 각 반복의 시작 부분에서 평가됨
- 무한 루프를 방지하려면 루프 변수를 반복문 내부에서 수동으로 업데이트해야 함
[Repeat-While 반복문]
- While 루프와 유사하지만 각 반복의 끝 부분에서 조건이 평가됨
- 반복문은 조건을 확인하기 전에 항상 한 번 이상 실행
반응형
'⌨️ Language > swift' 카테고리의 다른 글
[Swift] 클로저 (1) | 2024.03.18 |
---|---|
[Swift] 예외 처리와 함수 (4) | 2024.03.17 |
[Swift] 콜렉션 타입 (0) | 2024.03.16 |
[Swift] 변수와 프로퍼티2 (1) | 2024.03.15 |
[Swift] 변수와 프로퍼티1 (0) | 2024.03.15 |
댓글