[Swift 문법] 4 . 조건문 (if, switch)

JJOOEE__·2024년 6월 13일
0

Swift 문법

목록 보기
10/13
post-thumbnail

🍎 4. 조건문

  • Swift의 조건문은 코드의 흐름을 제어하기 위해 사용됩니다.
  • 대표적인 조건문 if, else, else if 및 switch 문에 대해 알아 볼 것!

🍏 1. if

  • if 명령어 만 단독으로 사용해도되고, else, else if 와 조합해서 사용 가능

  • 조건을 지정하고 해당 조건이 true이면 선택한 코드 실행

let firstCard = 11
let secondCard = 10

if firstCard + secondCard == 21 {
    print("잭팟!")
}

👆 조건이 true이면 중괄호 { } 안의 코드가 프린트 됩니다.

  • 원하는 경우 조건이 false 인 경우 실행할 대체 else 코드를 제공 할 수 있습니다.
let firstCard = 11
let secondCard = 10

if firstCard + secondCard == 21 {
    print("잭팟!")
} else {
    print("실패")
}

◻️ 1) else if 와 else 의 차이점

🌈 else

  • else는 앞선 모든 조건들이 거짓일 때 실행되는 블록입니다.
if score > 9000 {
    print("It's over 9000!")
}

if score <= 9000 {
    print("It's not over 9000!")
}

+ else 문

  • "만약 확인한 조건 이 true가 아니라면 이 코드를 대신 실행해!" 라는 의미를 가집니다.
if score > 9000 {
    print("It's over 9000!")
} else {
    if score == 9000 {
        print("It's exactly 9000!")
  } else {
        print("It's not over 9000!")
    }

🌈 else if

  • else if는 첫 번째 if 조건이 거짓일 때 추가적인 조건을 검사합니다.
  • else if 블록을 여러 개 사용할 수 있어, 다양한 조건을 순차적으로 검사할 수 있습니다.
if score > 9000 {
    print("It's over 9000!")
} else if score == 9000 {
    print("It's exactly 9000!")
} else {
    print("It's not over 9000!")
}

else if 블록을 여러 개 사용하면 각 블록마다 별도의 조건을 설정할 수 있습니다. 예를 들어, else if 블록을 2개 사용하면 총 3개의 조건을 검사할 수 있습니다: 첫 번째 if 조건과 2 개의 else if 조건, 그리고 마지막 else 블록으로 처리되지 않은 모든 경우를 다룰 수 있습니다.

let score = 75
if score > 90 {
   print("Grade: A")
} else if score > 80 {
   print("Grade: B")
} else {
   print("Grade: C")
}

◻️ 2) 조건 앞 '!'

  • ! 는 not 이라는 의미
  • 조건이 ture인지 false인지 정해 줄 때 사용
if !stayOutTooLate && !nothingInBrain {
    action = "cruise"
}

!stayOutTooLate 와 !nothingInBrain 두 조건을 검사
두 조건 모두 거짓 일 때 "cruise"

let stayOutTooLate = false
let nothingInBrain = false
var action = ""

if !stayOutTooLate && !nothingInBrain {
    action = "cruise"
}

print(action)  // Output: "cruise"
  • ! 연산자를 사용하여 조건을 부정합니다.

🍏 2. Switch

◻️ 1) Switch의 특징

  • Swift에서 switch 문은 여러 경우의 수를 처리할 때 사용되는 조건문
  • if-else 문과 비슷하지만,
    여러 값을 효율적으로 비교하고 처리할 수 있음
  • 매우 한정적인 값 (enum, case 등)이 비교 값이 아닌 한 default 구문은 반드시 작성함
  • case에 break를 추가하지 않아도 자동으로 case 마다 break 됨
  • fallthrough 키워드를 사용하여 break 되는 것을 무시 가능
  • fallthrough는 원하는 만큼 여러 번 사용 가능
  • 원하는 만큼 많은 case를 작성 가능
  • swift에서는 switch 구문의 조건에 다양한 값이 들어갈 수 있음
    • 각 case에 들어갈 비교 값은 입력 값과 데이터 타입이 같아야 함
  • case에는 범위 연산자를 사용할 수 있음
  • where 절을 사용하여 조건을 확장 가능

◻️ 2) Switch 구문 선언

switch 비교값 {
case 패턴:
  /*실행구문*/

default:      //else if 같은 개념
  /*실행구문*/
}
switch 입력 값 {
    case 비교 값1
    //실행 구문
    case 비교 값2
    //실행 구문
    
    // 이 case를 마치고 switch 구문을 탈출하지 않음. 아래 case로 계속 진행
    fallthrough
    
    case 비교 값3, 비교 값4, 비교 값5 // 한 번에 여러 값과 비교 가능
    break // 탈출(종료)
    
    default : // 한정된 범위가 명확하지 않다면 default사용 필수
    
    //실행 구문
}

if문과 switch문 비교

  • if문
let chr = "a"

if chr == "a" {
    print("캐릭터는 a 입니다.")
}
else if chr == "b" {
    print("캐릭터는 b 입니다.")
}
//캐릭터는 a 입니다.
  • switch문
let chr = "a"   //"b" 로 바꾸면 결과값은 "이것은 b 입니다."로 바뀜

switch chr {
case "a" :
    print("이것은 a 입니다.")
case "b" :
    print("이것은 b 입니다.")
default:
    print("아무것도 선택되지 않았습니다.")
}
//이것은 a 입니다.

◻️ 3) 다양한 값 타입 사용

  • switch 구문의 입력 값으로 숫자 표현이 아닌 문자, 문자열, 열거형, 튜플, 범위, 패턴이 적용된 타입 등 다양한 타입의 값도 사용 가능
  • 범위
let score = 85

switch score {
case 0..<60:
    print("You failed")
case 60..<80:
    print("You passed")
case 80...100:
    print("You did great!")
default:
    print("Invalid score")
}
  • 패턴
let someValue: Any = 5

switch someValue {
case 0 as Int:
    print("It's an integer 0")
case let x as Int where x > 0:
    print("It's a positive integer: \(x)")
case is Double:
    print("It's a double value")
case let text as String:
    print("It's a string: \(text)")
default:
    print("It's something else")
}

◻️ 3) 잘못된 case 사용

  • case에 실행 코드가 없기 때문에 컴파일 오류
let number = 2

switch number {
case 1:
    print("One")
case 2:
    // 아무런 코드도 없는 경우
case 3:
    print("Three")
default:
    print("Other")
}

◻️ 4) 열거형 사용

  • 열거형과 같이 한정된 범위의 값을 입력 값으로 받게 될 때 값에 대응하는 각 case를 구현한다면 default를 구현하지 않아도 됩니다.
    • 만약 값에 대응하는 각 case를 구현하지 않는다면 default는 필수입니다
enum School {
    case 유치원, 초등학교, 중학교, 고등학교, 대학교
}

let 나의학력: School = .대학교

switch 나의학력 {
case .유치원:
    print("저의 최종학력은 \(School.유치원) 입니다.")
case .초등학교:
    print("저의 최종학력은 \(School.초등학교) 입니다.")
case .중학교:
    print("저의 최종학력은 \(School.중학교) 입니다.")
case .고등학교:
    print("저의 최종학력은 \(School.고등학교) 입니다.")
case .대학교:
    print("저의 최종학력은 \(School.대학교) 입니다.")
}

// 저의 최종학력은 대학교 입니다.

🌈 만약 열거형에 case가 추가될 가능성이 있다면 switch 구문에서는 어떻게 해야 할까요?

  • 열거형에 정의한 모든 case를 처리해주면 정상적으로 컴파일되겠지만, 나중에 열거형에 case를 추가한다면 기존의 switch 구문은 컴파일 오류가 발생하게 될 것
  • switch 구문은 모든 case에 대해 대비하지 못하기 때문이죠. 이럴 때는 unknown이라는 속성을 사용하여 대처
enum Menu {
    case Pizza
    case Chicken
}

let lunchMenu: Menu = .Pizza

switch lunchMenu {
case .Chicken:
  print("양념치킨")
case .Pizza:
print("도미노피자!")
case _:  // default와 같은 표현
print("치킨소스 추가해주세요")
}
//도미노피자!
  • Menu라는 열거형에 나중에 case를 추가할 거 같아서 해당 열거형의 값을 처리하는 switch 구문의 마지막 case로 와일드카드 case(_)를 미리 추가했습니다. 그러면 나중에 Menu 열거형에 case를 추가해도 switch 구문에서 컴파일 오류가 발생하지 않게 됩니다.

  • 문법적으로 오류가 없지만 논리적으로 오류가 발생할 수 있는 충분한 여지가 생기게 됩니다. 이런 문제를 방지하기 위해 unknown 속성을 사용할 수 있습니다.

enum Menu {
    case Pizza
    case Chicken
    case Hamburger
}

let lunchMenu: Menu = .Pizza

switch lunchMenu {
case .Chicken:
  print("양념치킨")
case .Pizza:
print("도미노피자!")
@unknown case _:  // default와 같은 표현
print("치킨소스 추가해주세요")
    
}

🍏 switch문 vs if 문 언제 사용해야할까?

◻️ 1) if 문

  • 단순한 값 비교가 주된 목적

🌈 1.단순한 값 비교

  • if 문은 단순한 값 비교에 적합
    • 예를 들어, 변수의 값을 확인하고 특정 동작을 수행하거나 조건에 따라 다른 메시지를 출력하는 등의 경우에 사용됩니다.
let score = 85

if score >= 90 {
    print("A")
} else if score >= 80 {
    print("B")
} else if score >= 70 {
    print("C")
} else if score >= 60 {
    print("D")
} else {
    print("F")
}

🌈 2.범위 검사

  • 변수의 값이 특정 범위에 들어가는지 확인할 때
let temperature = 25

if temperature < 0 {
    print("Freezing")
} else if temperature >= 0 && temperature < 10 {
    print("Cold")
} else if temperature >= 10 && temperature < 20 {
    print("Cool")
} else if temperature >= 20 && temperature < 30 {
    print("Warm")
} else {
    print("Hot")
}

🌈 3. 복잡한 논리 조건

  • 여러 조건이 복합적으로 결합되어야 할 때
let age = 25
let isStudent = true

if age >= 18 && isStudent {
    print("Adult student")
} else if age < 18 && isStudent {
    print("Minor student")
} else if age >= 18 && !isStudent {
    print("Adult non-student")
} else {
    print("Minor non-student")
}

🌈 4. 옵셔널 바인딩

  • 옵셔널 값이 있는지 확인하고 값을 추출하는 경우 if let 또는 guard let 구문을 사용
var optionalName: String? = "Alice"

if let name = optionalName {
    print("Hello, \(name)")
} else {
    print("Hello, Anonymous")
}

◻️ 2) switch 문

  • 여러 값에 따라 다른 코드를 실행해야 하거나 복잡한 조건을 처리해야 할 경우 switch 문

🌈 1. 여러 값에 따라 다른 코드를 실행

  • 변수가 여러 값을 가질 때 각 값을 기준으로 다른 코드를 실행해야 할 경우 switch 문을 사용합니다.
let direction = "north"

switch direction {
case "north":
    print("Go north")
case "south":
    print("Go south")
case "east":
    print("Go east")
case "west":
    print("Go west")
default:
    print("Unknown direction")
}

🌈 2. 복잡한 조건을 패턴 매칭으로 처리할 때

  • 패턴 매칭을 사용하여 다양한 조건을 처리할 수 있습니다. 범위, 튜플, 값 바인딩 등의 패턴을 사용할 수 있습니다.
let point = (1, 1)

switch point {
case (0, 0):
    print("At the origin")
case (_, 0):
    print("On the x-axis")
case (0, _):
    print("On the y-axis")
case (-2...2, -2...2):
    print("Inside the box")
default:
    print("Outside the box")
}

🌈 3. 열거형 처리

열거형을 처리할 때 switch 문이 가독성과 유지보수성에서 좋음

enum CompassPoint {
    case north, south, east, west
}

let direction = CompassPoint.east

switch direction {
case .north:
    print("Go north")
case .south:
    print("Go south")
case .east:
    print("Go east")
case .west:
    print("Go west")
}
profile
개발이 어려운 나를 위한... 개발노트

0개의 댓글