본문 바로가기
⌨️ Language/swift

[Swift] 조건/반복문

by hyebin (Helia) 2024. 3. 17.

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 키워드를 사용해야 함
    • 매우 한정적인 값 (enumcase 등)이 비교 값이 아닌 한 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

댓글