[Swift 문법] 반복문, 조건문, 제어 전달문

Yellowtoast·2023년 2월 15일
0

Swift

목록 보기
3/11
post-thumbnail

해당 글은 [ 꼼꼼한 재은씨의 Swift : 문법편 ] 을 읽고 배운 내용을 정리한 글입니다.

반복문

스위프트에서 제공하는 반복문은 루프 횟수가 정해져 있는지를 기준으로 For 반복문, While 반복문 두가지로 나뉩니다.

스위프트 3.0버전 이후로 스위프트에서 for 반복문은 for ~ in 구문 뿐입니다.

for~in구문

for <루프 상수> in <순회 대상> {
    <실행할 구문>
}
for year in 1940 ... 2017 {
    print("\(year) 년도")
}
for i in 1 ..<10 {
    print(i)
}

루프 상수를 생략할 수도 있습니다.
순회 대상 자체보다는 단순히 순회 대상의 크기만큼 반복하는 것이 목적인 경우이죠.

let size = 5
let padChar = "0"
var keyword = "3"


for _ in 1 ...size {
    keyword = padChar + keyword
}

print("\(keyword)")

while 구문

while <조건식> {
    <실행할 구문>
}
var n = 2
while n < 1000 {
    n = n * 2
}

repeat while 구문

해당 구문은 실행 블록의 수행을 최소 한 번은 보장하는 특성을 가집니다.

repear {
   <실행할 구문>
}

while <조건식>
var n = 2
while n < 1000 {
    n = n * 2
}

조건문

스위프트에서 제공하는 조건문은 크게 3가지입니다.

  • if
  • guard
  • switch

If 구문

if

if <조건식> {
    <실행할 구문>
}
if age < adult {
    print("미성년자")
}

if ~ else

if age < adult {
    print("미성년자")
} else {
   print("성년자")
}

if ~ else if

if gender == "M" {
    print("남자")
} else if gender == "F"
	print("여자")
else {
   print("어디에도 속하지 않음")
}

Guard 구문

guard 구문은 후속 코드들이 실행되기 전에 특정 조건을 만족하는지 확인하는 용도록 사용합니다. 다시 말해 특정 조건을 만족하지 않은 채로 후속 코드를 실행하면 심각한 오류가 발생할 경우에, 전체 구문을 조기 종료 하기 위한 목적으로 사용됩니다.

함수의 실행을 종료할 때에는 return 구문을 사용합니다.

guard <조건식 또는 표현식> else {
    <실행할 구문>
}

guard 구문은 if 구문으로 대체가 가능하기 때문에 그다지 필요 없어 보일 수도 있습니다. 하지만 이 구문은 본래 실행 흐름을 종료하기 위한 목적으로 사용되는 구문이기 때문에, 코드를 중첩해서 사용하지 않아도 된다는 장점이 있습니다. 이 점은 전체 코드를 깔끔하고 단순하게 만들어 줍니다.


func divide(base: Int){
  guard base != 0 else {
     print("연산 불가")
     return
  }
  guard base > 0 else {
     print("base는 0보다 커야 합니다.")
     return
  }
}

#avaliable 구문

앱을 개발하다 보면 기기의 OS 버전별로 구문을 나누어 작성해야 할 때가 종종 있습니다. 해당 구문을 사용하여 처리하면 간결하면서 직접적으로 OS버전별 구문을 분리할 수 있습니다.

if #available(플랫폼이름 버전 ... , * ) {
    해당 버전 구문
} else {
   다른 환경에 대한 처리
}
if #available(iOS 9 , OSX 10.10, watchOS, *) {
    해당 버전 구문
} else {
   다른 환경에 대한 처리
}

switch 구문

스위프트의 switch 구문은 일치하는 패턴인 있을 경우 해당 블록의 실행 코드를 처리하고 더이상의 비교 없이 전체 분기문을 종료합니다. 따라서 break 구문을 스위프트에서는 생략할 수 있습니다.

switch 비교대상 {
	case 비교 패턴1 : 
    	실행구문
	case 비교 패턴2, 비교 패턴 3 : 
    	실행구문
	default: 
    	어떤 비교 패턴과도 일치하지 않았을 경우
        
}

Switch 구문에서 튜플 내부의 아이템이 비교 대상과 부분적으로 일치할 경우, 스위프트는 case 구문의 비교 패턴 전체가 일치하는 것으로 간주합니다. 이때 일치하지 않는 나머지 부분을 상수나 변수화하여 사용할 수 있습니다. 이해하기 어렵다면 다음 예제를 참고합니다.

var value = (2,3)
	switch value {
		case let (x, 3) :
			print (" 튜플의 두 번째 값이 3일 때 첫 번째 값은 (x) 입니다. ")
		case let (3, y):
			print ("튜플의 첫 번째 값이 3일 때 두 번째 값은 (y) 입니다. ")
		case let (x, y) :
			print ("튜플의 값은 각각 ((x) , 1 (y) 입니다")
    }
var passtime = 1957
switch passtime {
	case 0..<60:
		print ("방금 작성된 글입니다")
	case 60.. <3600 :
		print ("조금 전 작성된 글입니다" )
	case 3600.. <86400:
		print ("얼마 전 작성된 글입니다" )
	default:
		print ("예전에 작성된 글입니다")
}

범위 연산자를 사용한 패턴 비교 방식은 튜플 형식의 데이터를 비교할 때에도 매우 유용합니다. 정수로 구성된 튜플의 경우 아래와 같이 원소별로 범위 연산자를 이용한 범위를 사용하여 비교할 수 있습니다.

var value = (2, 3)
switch value {
	case (0..<2,3) :
		print("범위 A에 포함되었습니다")
	case (2..<5, 0..<3) :
		print("범위 B에 포함되었습니다")
	case (2. . 45, 3..45):
		print("범위 C에 포함되었습니다" )
	default:
		print("범위 D에 포함되었습니다" )
}

[실행 결과]
범위 C에 포함되었습니다

제어 전달문

스위프트에서 제공하는 조건문은 크게 3가지입니다.

  • break
  • continue
  • fallthrough
  • return

break

반복 실행 중인 루프를 조건식의 결과에 상관 없이 즉각적으로 종료할 때 사용

continue

이 구문 아래에 있는 실행 구문들을 건너뛰고 다음 반복을 시작하는 역할을 한다.

구문 레이블과 break, continue

스위프트에서는 반복문이나 조건문을 중첩하여 사용할 수 있습니다. 이를 이용하면 편리하고 효율적인 코드를 작성할 수 있습니다. 하지만 약간의 문제가 생길 수도 있습니다.

중첩된 구문들에서 continue, break 구문을 사용하려면 어떤 구문을 멈추거나 다시 시작하게 할지 명확하지 않다는 점입니다.

스위프트에서는 반복문이나 조건문 등 특정 구문에 레이블을 붙여 기억할 수 있도록 하고, break나 continue 구문이 사용될 때 레이블을 명시하여 개발자가 우너하는 구문 위치에서 정확히 흐름 제어가 적용될 수 있도록 합니다.

outer : for i in 1...5 {
   // 1에서 9까지 반복
	inner: for j in 1...9 {
		// j 의 값이 3일 때 break 구문을 실행한다.
		if (j==3) {
			break outer
		}
		//구구단을 출력한다.
		print("\(i) X \(j) = \(i * j)")
      }
  }

[실행 결과]
1 X 1 = 1
1 X 2 = 2

바깥쪽 루프에 outer 레이블을, 안쪽 루프에 inner 레이블을 지정해 준 다음, 이를 활용하여 안 쪽 루프에서 break outer를 호출하면 바깥쪽 루프까지가 모두 break 구문의 범위로 지정됩니 다. 안쪽 루프에서 break 구문을 호출했지만, 바깥쪽 루프까지 한꺼번에 종료되죠.

profile
Flutter App Developer

0개의 댓글