[Swift 프로그래밍] 조건문과 반복문

이정훈·2022년 5월 7일
0

Swift 기본

목록 보기
3/22
post-thumbnail

본 내용은 스위프트 프로그래밍 3판 (야곰 지음) 교재를 공부한 내용을 바탕으로 작성 하였습니다.

조건문

if문


다른 언어와 달리 스위프트의 if문은 조건 값이 항상 Bool 타입이어야 한다는것이 차이점이다.

let countryCode: Int = 82
var country: String = String()

if countryCode == 1 {   //소괄호는 선택사항
    country = "USA"
} else if countryCode == 81 {
    country = "Japan"
} else if countryCode == 82 {
    country = "Korea"
} else if countryCode == 86 {
    country = "Chaina"
} else {
    country = "데이터에 없는 국가 코드 입니다."
}

print(country)

위 코드로 확인 할 수 있는 또 다른 차이점은 소괄호(()) 생략이 가능하다는 것이다. 하지만 중괄호({}) 생략은 불가능하다.

switch문


switch문도 if문과 마찬가지로 소괄호(()) 생략이 가능하다. 뿐만 아니라 스위프트에서 switch문은 break문 생략도 가능하다.

let point:Int = 65

switch point {
case 90...:
    print("VVIP 등급 고객입니다.")     //break문 없이도 switch문 종료 가능
case 80..<90:
    print("Vip 등급 고객입니다.")
    break
case 70..<80:
    print("Gold 등급 고객입니다.")
    break
case 60..<70:
    print("Sliver 등급 고객입니다.")
    fallthrough     //다음 case도 실행
default:
    print("일반 등급 고객입니다.")
}

위 코드에서도 볼 수 있듯이 break문을 생략해도 switch문 종료가 가능하다. 또한 조건 만족 후에도 아래의 case문을 실행하고자 한다면 fallthrough 키워드를 사용하면 된다.(조건 만족 상관 없이 실행문 실행)

그리고 비교하는 값이 한정적인 값(열거형 등)이 아니라면, 스위프트에서 default문은 반드시 작성해 줘야한다.

만약 tuple 처럼 두개의 조건을 비교 해야 한다면 어떻게 해야 할까? 이때는 와일드카드 식별자(_)가 사용된다.

typealias languageRelease = (name: String, releaseYear: Int)

let tupleValue: languageRelease = ("Swift", 2014)

switch tupleValue {
case ("Swift", 2014):
    print("출시년도가 정확합니다.")
case ("Swift", _):
    print("언어만 맞았습니다. 출시년도는 \(tupleValue.releaseYear)입니다.")
case (_, 2014):
    print("출시년도만 맞았습니다. 언어는 \(tupleValue.name)입니다.")
default:
    print("정확하지 않습니다.")
}

name과 releaseYear 조건 중 하나만 만족 시킬때 와일드 카드 식별자(_)를 사용하였다.

다음으로 열거형을 이용한 switch문을 살펴보자

enum grade {
    case Freshman, Sophomore, Junior, Senior
}

let yourGrade: grade = .Sophomore

switch yourGrade {
case .Freshman:
    print("1학년입니다.")
case .Sophomore:
    print("2학년입니다.")
case .Junior:
    print("3학년입니다.")
case .Senior:
    print("4학년입니다.")
@unknown case _:    //unknown 속성으로 열거형에 case 추가시 논리적 오류 방지
    print("몇학년인지 알 수 없습니다.")
}

열거형에서는 각 case에 대응하는 switch-case문이 없다면 반드시 default문을 구현해야한다.
@unknown case _은 추후에 열거형에 새로운 case가 추가 될 경우 컴파일러가 switch문이 열거형에 모든 case와 대응되지 않는다는 경고를 보내 논리적 오류 발생을 대비 할 수 있다.
이러한 unknown 속성을 사용할 수 있는 case는 case_와 default case 뿐이다. 또한 unknown 속성을 구현한 case는 항상 마지막 case에 구현해야 한다.

반복문

for문


다음은 반복 가능한 자료형인 딕셔너리를 이용하여 for문을 구현한 코드이다.

let endOfMonth: [String: Int] = ["1월": 31, "2월": 28, "3월": 31, "4월": 30]

for (month, day) in endOfMonth {
    print("\(month), \(day)")
}

반복문으로 딕셔너리의 반환값은 key와 value로 구성된 tuple(튜플)타입으로 반환한다.

while문


스위프트의 while문도 다른 언어와 동일하게 조건문은 항상 Bool타입으로 지정해야한다.

다음은 배열을 사용한 while문을 구현한 코드이다.

var language1: [String] = ["Swift", "Objective-C", "Python", "Java"]

while language1.isEmpty == false {
    print("\(language1.removeFirst())")
}

while문의 조건문이 참일때까지 실행코드를 반복적으로 실행하게된다.

repeat-while문


스위프트의 repeat-while문은 자바로 따지자면 do-while문에 해당한다. repeat 구문을 먼저 1회 실시한 후 while문의 조건을 비교한다.

var language2: [String] = ["Kotlin", "JavaScript", "C++", "HTML"]

repeat {
    print("\(language2.removeFirst())")
} while language2.isEmpty == false

중첩된 반복문(구문 이름표)

필자가 생각하기에 반복문에서 다른 언어와 가장 큰 차별화 된 점이라고 생각한 것이 이 중첩된 반복문인데 다른 언어에서 복잡한 중첩된 반복문 활용시 break문 혹은 continue문의 범위가 헷갈리는 경우가 있었다.하지만 스위프트에서는 구문 이름표를 활용하여 어떤 범위에 적용되는지 명확하게 명시해 줄 수 있다.

let numbers: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var sumNum:Int = 0
var evenNumbers: [Int] = [Int]()

numbersLoop: for num in numbers {
    if num % 2 != 0 {
        continue numbersLoop    //반복문 제어 범위
    }
    evenNumbers.append(num)
    
    addLoop: while true {
        if evenNumbers.isEmpty == true {
            break addLoop   //반복문 제어 범위
        }
    
        sumNum += evenNumbers.removeFirst()
    }
}
print(sumNum)

위와 같이 반복문 시작 전에 구문 이름을 정해주면 break문 또는 continue문 뒤에 구문 이름을 붙여 구문 이름표를 사용 할 수 있다.

profile
새롭게 알게된 것을 기록하는 공간

0개의 댓글