Swift 7. 조건문

 Swift 7. 조건문



if 문 & switch 문

guard 문도 있음

소괄호( (    ) )를 대부분 생략할 수 있음

중괄호({ })는 생략할 수 없음




1. if 문

if, else 등의 키워드를 사용하여 구현

if 구문은 조건의 값이 반드시 Bool 타입이어야 함


* 예시

let num1: Int = 5

let num2: Int = 7


if num1 > num2{

    print("num1 > num2")

}

else if num1 < num2 {

    print("num1 < num2")

}

else {

    print("num1 == num2")

}


<실행결과>

num1 < num2



else if 는 몇 개가 있어도 상관 없음

else 블록은 없어도 상관 없음

else if 조건을 충족해서 블록 내부의 명령문이 실행되면 그 다음에 이어진 else if의 조건을 충족 하더라도 실행되지 않고 조건문을 빠져나옴

if 키워드 뒤에 따라오는 조건수식을 괄호로 감싸는 것은 선택사항

마지막 else는 생략가능

else나 else if 없이 if만 단독으로 사용 가능



* 예시

let num1: Int = 5

let num2: Int = 7

var biggerNum: Int = 0


if num1 > num2{

    biggerNum = num1

}

else if (num1 < num2){ // 조건수식을 ()로 감쌈

    biggerNum = num2

}else if (num1 == 5){   // 참이지만 이미 위에서 조건이 충족되어 실행되지 않음

    print("num1 : \(num1)")

}

// 마지막 else 생략


print("biggerNum = \(biggerNum)")

<실행결과>

biggerNum = 7






2. switch 문

다른 언어들과 많이 다름

소괄호 ( (   ) ) 생략 가능

break 키워드 사용은 선택사항 -> case 내부의 코드를 실행하면 break 없이 switch 문을 빠져나옴

다른 언어에서 사용하던 break를 사용하지 않고 여러 case를 반복해서 사용하는 방식을 사용할 수 없음

switch 문의 case를 연속해서 실행하려면 fallthrough 키워드 사용 - 다음 case의 비교값이 입력값과 다르더라도 실행문 실행


Swift에서는 switch 문의 조건에 다양한 형태의 값이 들어갈 수 있음

각 case에 들어갈 비교 값과 입력값의 데이터 타입은 같아야함

비교될 값이 명확히 한정적인 값(열거형 값 등)이 아닌 경우에는 반드시 default를 작성해야함


각 case 에서는 범위연산자를 사용할 수도 있고 where 절을 사용해서 조건을 확장할 수도 있음


switch [입력값]{

case [비교값 1] :

    실행문

case [비교값 2] :

    실행문

case [비교값 3], [비교값 4] : // 한 번에 여러 값과 비교 가능(or)

    실행문    

    break  // break를 통한 종료는 선택사항

default : // 한정된 범위가 명확하지 않다면 default는 필수

    실행문



* 예시

let num = 7


switch num{

case 0:

    print("num == 0")

case 1...10:    // 범위 연산자 사용

    print("num == 1 ~ 10")

    fallthrough // 다음 case의 실행문도 실행

case Int.min..<10, 101..<Int.max: // 두개의 비교값(범위 연산자) 사용

    print("num < 0 or num > 100")

default:

    print("10 < num <= 100")

}

<실행결과>

num == 1 ~ 10

num < 0 or num > 100




범위 연산자는 정수 뿐만 아니라 실수에도 사용할 수 있음 (자료형이 같아야 함)


* 예시 

let num: Double = 3.14


switch num{

case 0:

    print("num = 0")

case 2.5...3.5:

    print("2.5 <= num <= 3.5")

default:

    print("num = \(num)")

    

}


<실행결과>

2.5 <= num <= 3.5




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



* 예시 - 문자열 switch 문

let name: String = "Son"


switch name{

case "Kim":

    print("He is my brother Kim)")

case "Lee":

    print("He is my sister Lee")

case "Park", "Choi", "Son": // 여러개의 비교값 사용

    print("He is my friend \(name)")

default:

    print("I don't know \(name)")

}


<실행결과>

He is my friend Son



여러개의 항목을 한 번에 case로 지정해줄 수 있음

여러 항목을 나타내기 위해 case를 연달아 사용할 수는 없음

case 다음에는 반드시 실행할 수 있는 실행문이 나와야 함

다른 언어처럼 case를 연달아 사용해서 구현하려면 fallthrough 키워드를 사용


* 예시

let name: String = "Son"


switch name{

case "Kim":

    print("He is my brother Kim)")

case "Lee":

    print("He is my sister Lee")

case "Park":

case "Choi":

case "Son": // case를 연달아 사용하면 에러 발생

    print("He is my friend \(name)")

default:

    print("I don't know \(name)")

}

=> 에러 발생

let name: String = "Son"


switch name{

case "Kim":

    print("He is my brother Kim)")

case "Lee":

    print("He is my sister Lee")

case "Park":

    fallthrough

case "Choi":

    fallthrough // fallthrough 키워드 사용

case "Son":

    print("He is my friend \(name)")

default:

    print("I don't know \(name)")

}

<실행결과>

He is my friend Son





* 예시 -  튜플 switch 문

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


let tuple: NameAge = ("Lee", 25)



switch tuple{

case ("Lee", 25):

    print("정답!")

default:

    print("틀렸습니다")

}

<실행결과>

정답!



와일드카드 식별자(_)를 사용하면 튜플의 요소중에서 일부만 일치하는 경우도 처리할 수 있음

* 예시

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


let tuple: NameAge = ("Lee", 24)



switch tuple{

case ("Lee", 25):

    print("정답!")

case ("Lee", _):    // 와일드카드 식별자 사용

    print("이름만 맞췄습니다. 나이: \(tuple.age)")

case (_, 25):       // 와일드카드 식별자 사용

    print("나이만 맞췄습니다. 이름: \(tuple.name)")

default:

    print("틀렸습니다")

}


<실행결과>

이름만 맞췄습니다. 나이: 24



위의 경우에는 와일드카드 식별자를 사용할 때 무시된 값을 직접 가져 와야만 함(tuple.age 등)

let 을 붙인 값 바인딩을 이용하면 미리 지정된 조건값을 제외한 다른 값을 실행문으로 가져올 수 있음


* 예시

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


let tuple: NameAge = ("Lee", 24)



switch tuple{

case ("Lee", 25):

    print("정답!")

case ("Lee", let age):

    print("이름만 맞췄습니다. 나이: \(age)")

case (let name, 25):

    print("나이만 맞췄습니다. 이름: \(name)")

default:

    print("틀렸습니다")

}

<실행결과>

이름만 맞췄습니다. 나이: 24






* 예시 - where 키워드를 이용한 조건 확장

let 직급: String = "사원"

let 연차: Int = 1

let 인턴인가: Bool = false


switch 직급{

case "사원" where 인턴인가 == true:

    print("인턴입니다")

case "사원" where 연차 < 2 && 인턴인가 == false:

    print("신입사원입니다")

case "사원" where 연차 > 5:

    print("오래된 사원 입니다")

case "대리":

    print("대리입니다")

default:

    print("팀장입니다")

}








열거형 등으로 한정된 범위의 값을 입력 값으로 받게될 때 모든 값에 대응하는 case를 구현하면 default를 작성하지 않아도 됨

값에 대응하는 모든 case를 구현하지 않았다면 반드시 default를 작성해야 함


* 예시 - 열거형의 모든 값에 대응하는 case 구현

enum School{

    case elementary, middle, hight

}


let student: School = School.hight


switch student{

case .elementary:

    print("초등학생")

case .middle:

    print("중학생")

case .hight:

    print("고등학생")

}

=> default를 작성하지 않아도 됨




만약 나중에 열거형에 case가 추가된다면 기존의switch 문은 컴파일 에러 발생

와일드카드 식별자를 사용하면 열거형에 case가 추가 됐을 때 에러가 발생하지 않고 정상 작동함


* 예시

enum School{

    case elementary, middle, hight, college

}


let student: School = School.hight


switch student{

case .elementary:

    print("초등학생")

case .middle:

    print("중학생")

case .hight:

    print("고등학생")

case _:

    print("어느 학교 학생?")

}



그런데 이런 경우에는 나중에 열거형에 case가 추가되었을 때 문법적 오류는 없지만 논리적 오류가 발생할 가능성이 있음

-> @unknown 속성을 이용하면 추가된 case를 처리해주지 않았을 경우 경고가 발생해서 논리 오류가 발생하지 않도록 해당 switch 문이 모든 case에 대응하지 않았다는 사실을 상기시켜줌

unknown 속성을 부여할 수 있는 case는 case _ 나 default 뿐이고 switch 문의 마지막 case로 작성해야 함


* 예시 - unknown 속성 사용

enum School{

    case elementary, middle, hight, college

}


let student: School = School.hight


switch student{

case .elementary:

    print("초등학생")

case .middle:

    print("중학생")

case .hight:

    print("고등학생")

@unknown case _:

    print("어느 학교 학생?")

}










=> 경고 발생








댓글

이 블로그의 인기 게시물

Spring Boot 6. 계시판 프로젝트

Spring Boot 2. Maria 데이터베이스 & Spring Data JPA

Django 10. DB 연동