흐름제어 - 조건문

hoBahk·2021년 6월 28일
0

1. if 문

if구문은 대표적은 조건문으로, if, else 등의 키워드를 사용하여 구현할 수 있다.
정수, 실수 등 0이 아닌 모든 값을 참으로 취급하여 조건 값이 될 수 있었던 다른 언어와는 달리 스위프트의 if구문은 조건의 값이 꼭 Bool타입이어야 한다.

ex) if문 기본 구현

let first: Int = 5
let second: Int = 7

if first > second {
    print("first > second")
}else if first < second {
    print("first < second")
}else{
    print("first = second")
}

ex) if구문의 다양한 구현(소괄호 없는 코드)

let first: Int = 5
let second: Int = 5
var biggerValue: Int = 0

if first < second { // 조건 수싲을 소괄호로 묶는 것은 선택 사항
    biggerValue = first
}else if first == second{
    biggerValue = first
}else if first < second{
    biggerValue = second
}else if first == 5{ // 이미 위에서 first == second 조건이 충족 되었기 때문에 실행되지 않는다.
    biggerValue = 100
}
// 마지막 else, else if는 생략 가능
// else나 else if 없이 if만 단독으로 사용할 수 있다.

ex) if구문의 다양한 구현(소괄호가 있는 코드)

let first: Int = 5
let second: Int = 5
var biggerValue: Int = 0

if (first < second) { // 조건 수싲을 소괄호로 묶는 것은 선택 사항
    biggerValue = first
}else if first == second){
    biggerValue = first
}else if (first < second){
    biggerValue = second
}else if (first == 5){ // 이미 위에서 first == second 조건이 충족 되었기 때문에 실행되지 않는다.
    biggerValue = 100
}

2. switch 문

switch 구문도 소괄호를 생략할 수 있다. 단, break 키워드 사용은 선택 사항이다.
즉, case 내부의 코드를 모두 실행하면 break 없이도 switch 구문이 종료된다.
따라서 break문을 쓰지 않고 case를 연속 실행하던 트릭을 더 이상 사용하지 못한다.
case를 연속해서 사용하기 위해선 fallthrough 키워드를 사용한다.

C 언어에서는 정수 타입만 들어갈 수 있었으나 스위프트에서는 switch 구문의 조건에 다양한 값이 들어갈 수 있다. 하지만 각 case에 들어가 비교 값은 입력 값과 데이터 타입이 같아야 한다. 또, 비교될 값이 명확히 한정적인 값(열거형 값 등)이 아닐 때는 default를 꼭 작성해줘야 한다. 또, 각 case에는 범위 연산자를 사용할 수도, where 절을 사용하여 조건을 확장할 수도 있다.

ex) switch 구문 기본 구현

let integerValue: Int = 5
 
switch integerValue{
case 0:
    print("Value == zero")
case 1...10:
    print("Value == 1~10")
    fallthrough
case Int.min..<0, 101..<Int.max:// fallthrough 키워드를 사용하여 실행되도록 함.
    print("Value < 0 or Value > 100")
default:
    print("10 < Value <= 100")
}

ex) 부동소수 타입의 범위 연산을 통한 switch case 구성

let doubleValue: Double = 13.0

switch doubleValue {
case 0:
    print("Value == zero")
case 1.5 ... 10.5:
    print("1.5 <= Value <= 10.5")
default:
    print("Value == \(doubleValue)")
}

ex) 문자열 switch case 구성

let stringValue: String = "Ronaldo"

switch stringValue {
case "PARK":
    print("PARK")
case "Buffon":
    print("Buffon")
default:
    print(stringValue)
}

ex) 잘못된 case 사용

let stringValue: String = "Ronaldo"

switch stringValue {
case "PARK":
    print("PARK")
    
case "Buffon":
  //비어있으므로 오류 발생!
default:
    print(stringValue)
}

ex) fallthrough의 사용

let stringValue: String = "Buffon"

switch stringValue {
case "PARK":
    print("PARK")
case "Buffon":
    fallthrough
case "Ronaldo":
    fallthrough
default:
    print(stringValue)
}

ex) 튜플 switch case 구성

typealias NameAge = (name: String, age: Int)

let tupleValue: NameAge = ("sara", 27)

switch tupleValue{
case ("sara",27):
    print("\(tupleValue) GOOD!" )
default:
    print("What?")
}

ex)와일드카드 식별자를 사용한 튜플 switch case 구성

typealias NameAge = (name: String, age: Int)

let tupleValue: NameAge = ("sara", 29)
switch tupleValue {
case ("sara", 29):
    print("GOOOOD!")
    fallthrough
case (_,29):
    print("나이만 맞음!")
    fallthrough
case ("sara",_):
    print("이름만 맞음!")
    fallthrough
default:
    ("What??")
}

result
//GOOOOD!
//나이만 맞음!
//이름만 맞음!

ex) 값 바인딩을 사용한 튜플 switch case 구성

typealias NameAge = (name: String, age: Int)

let tupleValue: NameAge = ("john", 42)

switch tupleValue {
case ("john", 42):
    print("GOOOD!!")
case ("john", let age):
    print("이름만 맞음!")
case (let name, 42):
    print("나이만 맞음!")
default:
    print("??")
}

ex) 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("owner?")
}

ex) 열거형을 입력 값으로 받는 switch 구문

let 최종학력: School = School.university

switch 최종학력{
case .primary:
    print("유치원")
case .elementary:
    print("초등학교")
case .middle:
    print("중학교")
case .university:
    print("대학교")
case .gradute:
    print("대학원")
default:
    print("중졸 or 고졸?")
}

ex) menu 열거형의 모든 case를 처리하는 switch 구문의 상태

enum Menu{
    case chicken
    case pizza
}

let lunchMenu: Menu = .chicken

switch lunchMenu{
case .chicken:
    print("황금올리브")
case .pizza:
    print("포테이토")
case _: // case== defult:
    print("what!")
}

ex) 차후에 Menu 열거형에 추가한 case를 처리하지 않으면 경고를 내어줄 unknown 속성

enum Menu{
    case chicken
    case pizza
    case hamberger
}

let lunchMenu: Menu = .chicken

switch lunchMenu{
case .chicken:
    print("황금올리브")
case .pizza:
    print("포테이토")
@unknown case _: // case== defult: // @unknown을 사용하여 경고 발생시킴
    print("what!")
}
profile
호박에 줄 그어서 수박 되는 성장 드라마

0개의 댓글