본문 바로가기
iOS/Swift

[iOS/Swift] 조건부 흐름제어, Condition Flow Control

by iosdevlime 2022. 11. 4.

Swift 프로그래밍 과정에서,

우리가 작성하는 코드를 구문(Statement)이라 합니다.

 

이러한 구문은 아래와 같이 3가지 유형으로 구분됩니다.

  • 단순문(simple) : 값 출력, 객체 선언, 구조체, 클래스 정의와 같은 표현식이나 선언 구문
  • 컴파일러 제어(compiler control) : 컴파일러의 작동을 바꾸도록 허용하는 구문
  • 흐름제어(control flow) 프로그램의 실행흐름을 바꾸기 위한 구문

 

앞서 배운 Swift 문법의 내용의 대부분은 단순문(값 출력, 객체선언)으로 분류할 수 있습니다.

 

 


 

하지만,

옵셔널 바인딩이나, 연산자 포스팅 내용 중,

" ~와 같은 경우, ~와 같이 실행" 과 같은 일종의 조건을 담고 있는것을 확인할 수 있습니다.

 

대부분 프로그래밍 기술은 하나 이상 조건을 기반으로 결정하는 코드가 필요합니다.

프로그램 흐름을 통제, 원하는 결과를 얻는 것을 제어흐름(Control Flow) 이라고 합니다.

 

 

 

이번, 그리고 다음 포스팅을 통해

제어흐름(Control Flow)의 2가지 유형인 조건문반복문에 대해 살펴보고자 합니다.

 

 

 

 

 

 

조건부 흐름제어 (Condition Flow Control)

선언한 변수, 혹은 코드에 대해 특정 조건을 부여함으로서 출력값을 조정

 

조건부 흐름제어란,

 

순차적으로 진행되는 프로그램, 혹은 코드의 흐름을 제어하기 위해

특정 조건에 따라 건너뛰거나 되돌아오는 구문입니다. 

 

이는 활용 방식에 따라

if 조건문, switch 조건문, guard 조건문 으로 나뉘게 됩니다.

 

 

 


 

 

 

If 조건문

만약 / 그렇지 않다면 ? /  혹시, 아무것도 아니라면? 

 

If 조건문 (기본형태)

  • if 조건문은, Boolean 조건식을 활용한 제어 흐름입니다.
    • 조건식(Boolean expression)이 true로 판단되면, 구문 내의 코드가 실행됩니다.
    • 기본형태는 다음과 같습니다.
if 변수(상수)값 + 조건식  {
   // 조건식이 true일 경우 실행문
}
더보기
// 숫자 크기비교를 위한 if 조건문

// 1. 10의 값을 할당받은 상수 x를 선언합니다.
let x = 10

// 2. if 조건문을 활용하여 비교구문을 만듭니다. 
if x > 9 {
	print("x is greater than 9")
}

// 3. 결과를 실행합니다.
// "x is greater than 9"

// --------------------------


// 4. 만약, 조건문이 10보다 초과된다는 구문을 작성한다면?
if x > 10 {
	print("x is greater than 10")
}

// 아무런 호출값이 없습니다.

 

 

 

 

If - else 조건문

  • 단순 if 조건문의 경우, 단 하나의 조건만 확인하고 호출할 수 있습니다.
  • 위에서 다룬 숫자 크기비교 예시를 살펴보면, 조건문이 거짓(false)일 경우 호출값이 나타나지 않았습니다.
    • 거짓(false)일 경우, 호출값을 얻기 위해 또 다른 조건else 키워드 를 함께 활용할 수 있습니다.
  • 기본 형태는 다음과 같습니다.
if 변수(상수)값 + 조건식A {
   // 조건식A가 참일 때 실행구문
   } else {
   // 조건식이 거짓(false)일 때 실행구문
}
더보기
// 1. 'Lime'이라는 문자열을 myFriend 상수에 할당합니다.
let myFriend: String = "Lime"


// 2. 비교연산자를 활용하여 if-else 조건문을 사용합니다.

if myFriend == "Jason" {
    print("my friend name is Jason")
} else {
    print("my friend name is Lime")
}

// 3. 첫번째 if 조건문은 비교연산자에 따라 거짓(false)이므로,
// 결과는 else 구문의 실행문이 도출됩니다.
// "my friend name is Lime"

 

 

 

If - else if 조건문

  • if-else 조건문은 단 2개의 조건만을 활용할 수 있다는 한계가 있습니다.
  • 만약, 2개 이상의 조건을 설정하여 호출값을 얻고 싶다면, if-else if 키워드 조건문을 사용합니다.
    • else if 뒤에 추가적인 조건식을 설정할 수 있습니다.
    • 또한, 구문을 종료할 땐 반드시 else 키워드로 마무리 합니다.
      (모든 조건식이 거짓일 경우, 대응할 실행구문이 반드시 필요하기 때문입니다)
  • 기본형태는 다음과 같습니다.
if 변수(상수)값 + 조건식A {
     // 조건식A가 참일 때 실행구문
   } else if 변수(상수)값 + 조건식 B {
     // 조건식B가 참일 때 실행구문
   } else if 변수(상수)값 + 조건식 C {
     // 조건식C가 참일 때 실행구문 
   } else {
     // 조건식 A,B,C 모두 거짓(false)일때 실행구문
}

 

 


 

 

guard - else 조건문

거짓(false)을 먼저 Check, 이후 참(true)이면 그 다음으로 !

 

if 조건문  vs guard 조건문 

  • 두 구문은 모두 Boolean 표현식을 포함한다는 공통점을 지닙니다.
  • 하지만, guard 구문은 조건이 거짓(false)일 경우를 먼저 걸러냅니다.
    (function, method 구문에서 주로 활용되므로, 추후 포스팅에서 구제적으로 다루도록 하겠습니다)



 

guard-else 조건문

  • guard 키워드는 else 구문 과 함께 활용됩니다.
  • 기본형태는 다음과 같습니다.
guard 조건문(Boolean 표현식) else {
   // 거짓(false) 일때 실행문
   // 혹은 종료 구문
} 조건문이 참(true) 일 때 실행문

 

(함수구문을 활용한 예시이므로, 전체적인 로직만 살펴보시길 바랍니다)

더보기
// 1. 특정 상수에 10을 곱하는 함수이며, 
// 값을 알 수 없는 Optioanl value 값을 인자로 선언합니다.

func multiplyByTen(value: Int?) {
    
    // 2. guard 조건문에 옵셔널 바인딩을 활용하고,
    // number(value) < 10 이하라는 조건을 작성합니다.
    
        guard let number = value, number < 10 else {
        print("number is too high")
        return
    }
    
    // 3. 새로운 인스턴스인 result 상수를 함수 내 선언하고, 
    // number 값에 10을 곱하는 산술연산 표현식을 할당합니다.
    let result = number * 10
    print(result)
}


// 4. 메서드를 호출하는데, 인자값으로 5로 할당한다면?
multiplyByTen(value: 5) // 50 

// 5. 만약, 인자값으로 10을 할당할 경우? 
multiplyByTen(value: 10) // "number is too high" (guard 조건에 의해)

 

 


 

 

switch 조건문

case 별 조건을 선언, 비교함으로서 '참(true)'인 조건을 찾는다!

 

 

switch - default 조건문이란? 

  • 다양한 조건을 case 키워드를 활용하여 관리함으로서 값을 반환하기 위해 사용되는 조건문입니다.
  • 쉽게 말해, 조건이 많아지면 되도록 Switch 구문을 활용하여 작성하는 것이 바람직합니다.
    • case의 조건은 1개 이상이 될 수도 있으며, if-else if 구문을 대체합니다.
    • 주로 enum 타입과 함께 활용됩니다.
  • 기본형태는 다음과 같습니다.
Switch 변수값 {
	case 조건(비교)식 A :
    	// A 조건식이 참(true)일 경우 실행문
	case 조건(비교)식 B :
    	// B 조건식이 참(true)일 경우 실행문
	default :
        // 어느 조건과도 일치하지 않았을 때 실행문
}

 

더보기
// 1. 임의 상수, someInteger에 100이란 초기값을 할당합니다.
let someInteger: Int = 100

// 2. Switch 구문을 활용하여 복수의 조건을 나열합니다.

switch someInteger {
	case 0 :
    	print("Zero")
	case 1..<100 :
    	print("1~99")
	case 100 :
    	print("correct!")
	case 101...Int.max :
    	print("over 100")
	default :
    	print("unknown")
}

// 3. switch 구문의 다양한 Case 조건을 파악합니다.
// case 중, case 100 일 경우가 참(true)이므로
// 결과는 "correct"

 

 

 

switch - where 조건문 

  • where 키워드는 case 구문에 부가적인 조건을 추가하기 위해 활용됩니다.
  • 기본형태는 다음과 같습니다.
switch (변수 혹은 상수) {
	case 조건문A where (변수 혹은 상수) 조건문B :
    // 실행구문
    case 조건문C where (변수 혹은 상수) 조건문D : 
    // 실행구문
    
    ...
    
    default :
    // 어느 비교패턴과도 일치하지 않을 경우, 실행됨
}

 

더보기
// 1. 임의의 상수 someInteger에 95란 초기값을 할당합니다.
let someInteger:Int = 95

switch someInteger {

// case는 0인데.. (추가로) someInteger를 2로 나눴을때 나머지가 0이면 ?
case 0 where someInteger % 2 == 0 :
    print("zero")

case 1..<100 where someInteger % 2 == 0 :
    print("l~99")

case 100 where someInteger % 2 == 0 :
    print("100")

case 101 ... Int.max where someInteger % 2 == 0 :
    print("over 100")

default :
    print("unknown")
}

// 2. 결과는 다음과 같습니다.
// where 키워드가 추가적으로 들어와 마치 &&(and)기능을 수행하고 있으므로
// someInteger가 95일때는 아무런 조건도 만족하지 못합니다.

 

 

 

 

 

 

댓글