iOS/Swift 문법

[Swift 문법] 제어 흐름, 반복문과 조건문

초코비23 2021. 12. 24. 23:09

제어 흐름

어떤 프로그래밍 언어를 사용하든 애플리케이션 개발은 로직을 적용하는 작업이며, 대부분의 프로그래밍 기술은 하나 이상의 조건을 기반으로 결정해가는 코드를 작성하는 것이다.

이는 실행되는 프로그램의 흐름을 통제하는 것이므로 제어 흐름이라고 한다.

일반적으로 제어 흐름은 반복 제어와 조건부 제어 흐름으로 나뉜다.

 

 

반복 제어 흐름

- for-in 반복문

흔히 말하는 반복문이다. 먼저 for-in 반복문은

for 상수명 in 컬렉션 또는 범위 {
	//실행될 코드
}

이와 같이 사용한다.

이 구문에서 상수명은 상수로 사용되는 이름으로 반복문이 실행되는 컬렉션 또는 범위의 현재 항목을 담게 될 것이다.

컬렉션 또는 범위는 문자열들의 배열, 범위 연산자, 또는 문자열 자체가 될 수 있따.

 

 

- while 반복문

while 반복문은 어떤 조건을 만족할 때까지 반복해야 하는 코드가 있는데 그 조건을 충족할 때까지 몇 번을 반복해야 하는지를 알 수 없는 경우에 사용하면 유용하다.

while 조건문{
	// 실행할 코드
}

이와 같이 반복하는 횟수를 지정하는 것이 아닌 조건문 하나로 반복을 할 수 있다.

 

 

- repeat ... while 반복문

repeat ... while 반복문은 스위프트 1.x 버전의 do ... while 반복문을 대체한 것이다.

while반복문을 거꾸로 한 것이라고 생각하면 이해가 편한데 while반복문 안의 코드를 실행하고 조건을 본다.

이 말은 즉 한번은 무조건 실행이 된다는 것이다.

repeat {
	// 실행될 코드
} while 조건식

 

 

- 반복문에서 빠져나오기

반복문을 만들었는데 반복문이 종료되는 조건을 만족하기 전에 어떤 조건에서 반복문을 빠져나와야 할 경우가 있다.

특히, 무한 반복을 만들었을 경우 필수적으로 반복문을 빠져나오도록 만들어야 한다.

스위프트에서는 반복문을 빠져나오기 위해 break, continue 이렇게 두가지를 제공한다.

 

break 구문은

var j = 10

for _ in 0 ..< 100 { // 상수를 _로 써서 참조제를 비울 수 있다. 0~99까지 반복
	j += j
    
    if j > 100 {
    	break		// 반복문에서 빠져나오는 break
    }
    
    print("j = \(j)")
  
}

이 코드는 for in 문에 의해 0~99번 돌면서, j값이 100을 넘으면 종료하고 반복문 다음의 코드가 진행하게 된다.

 

 

continue 구문은

var i = 1

while i < 20{ // i가 20보다 작으면 계속 반복
	i += 1
    if (i % 2) != 0{
    	continue		// continue는 while반복문의 맨 위로 돌아간다
    }
	print("i = \(i)")
}

이 코드는 i가 2~20까지 반복하면서 i가 짝수인 값들을 출력한다.

 

break구문은 실행 시 바로 반복문을 종료하고 다음 코드를 진행하며

continue구문은 실행 시 반복문의 나머지 코드를 건너뛰고 반복문의 처음으로 다시 돌아가게 한다.

 

 

조건부 흐름 제어

프로그래밍은 로직을 적용하는 거대한 작업이므로, 하나 이상의 조건을 기반으로 결정하는 코드를 작성하는 데 대부분의 프로그래밍 기술을 사용된다.

이러한 결정은 코드가 실행될 때 어떤 코드가 실행되고 어떤 코드를 건너뛰어야 하는지를 정의하는 것이다.

이것을 흐름 제어라고 하는데 실행되는 프로그램의 흐름을 통제하기 때문이다.

 

- if 조건문

아마도 if구문은 스위프트 프로그래머에게 가장 기본적인 흐름 제어 방법일 것이다.

C, Python, 등등 다양한 언어에서도 비슷한 유형으로 쓰이고 있다.

 

if 조건식 {
	// 조건식이 true이면 실행될 코드
}

스위프트의 if구문의 기본 구조는 위와 같다.

다른 프로그래밍 언어와의 다르게 코드가 한 줄이라고 해도 스위프트에서는 괄호{}가 필수적이다.

 

- if ... else ... 조건문

변형된 if구문으로 if구문의 조건문이 false일 때 수행할 코드를 else로 지정할 수 있다.

if 조건식 {
	// 조건식이 true일 때 수행될 코드 
} else {
	// 조건식이 false일 때 수행될 코드 
}

 

 

- if ... else if ... 조건문

지금까지는 하나의 논리 표현식의 결과를 바탕으로 결정하였지만 다양한 조건을 바탕으로 결정해야 할 때가 많이 존재한다.

이러한 경우에 else if 구문을 사용할 수 있다.

let x = 9

if x == 10{
	print("x = 10")
}
else if x == 9 {
	print("x = 9")
}
else if x == 8 {
	print("x = 8")
}

이 방법은 몇 안되는 비교에는 좋지만 많은 양의 조건문이 있는 경우에는 좀 더 유연하고 효과적인 switch라는 방법도 존재한다.

 

- guard 구문

guard 구문은 스위프트 2에서 도입된 기능으로 guard 구문은 불리언 표현식을 포함하며, true일 때만 guard 구문 다음에 위치한 코드가 실행된다. guard구문은 불리언 표현식이 false일 때 수행될 else 절을 반드시 포함해야 한다.

guard 조건문 else {
	// 조건문이 false일 때 실행될 코드
    
    <종료 구문> //반드시 흐름에서 빠져나가는 구문(return, break continue, throw등)이 필요하다.
}

// 조건문이 true일 때 실행될 코드

 

- switch 구믄

몇 가지 논리적 조건문에는 if elseif 구조로 충분하지만 많은 조건이 존재한다면 switch 구문이 효과적이다.

 

기본적인 switch 구문은

switch 표현식 {
	case 일치하는 값 1:
    	//일치할 경우 코드 1
	case 일치하는 값 2:
    	//일치할 경우 코드 2
        case 일치하는 값 3:
    	//일치할 경우 코드 3
        
    default:
    	// 아무것도 일치하지 않을 경우
}

이와 같이 표현식은 값을 나타내거나 값을 반환하는 표현식이다. 이 값은 switch구문이 동작하게 하는 값이다.

 

그 값과 일치하는 값을 case구문으로 제공하고 일치할 경우 해당하는 코드가 실행된다.

그리고 else와 같이 default구문은 아무것도 case에 만족하지 않는 경우르 정의할 수 있다.

 

또한 case는

let value = 12

switch (value){
	case 0, 1, 2:
    	print("value is o or 1 or 2")
    
	case 3...5:
    	print("value is 3 ... 5")
    
	case 6...9 where value % 2 == 0:
		print(" 6 ~ 9 and even")

	case 10...12:
    	print("10 ... 12")
    	fallthrough    // switch문을 나가는 것이 아닌 아래 case 문도 실행된다.

	case 10...12:
		print("fallthrough문에 따라 이 case문도 실행된다.")
        
	default:
    	print("value is not Integer")
}

case 0,1,2: 처럼 식으로 결합이 가능하다.

case 3...6: 처럼 범위를 지정할수도 있다.

case 6...9 where value %2 == 0: 처럼 where구문으로 부가적인 조건을 추가할 수도 있다.

 

switch구문을 잘 보면 continue, break와 같은 구문이 없다.

스위프트 switch는 case의 조건에 일치하면 자동으로 구문 밖으로 빠져나간다.

하지만 fallthrough구문을 사용하면 switch구현부에 예외상황 효과를 주어, 실행 흐름이 그 다음 case 구문으로 계속 진행하게 할 수 있다.

 

 

 

 

 

출처 : 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍

책을 보면서 내용을 정리했습니다.. 혹시 틀린 내용이 있다면 댓글로 언제나 말씀해주세요!!!☺️