0%

SWIFT-Loop

SWIFT_꼼꼼한 재은씨 문법편


반복문(Loop) 목차

  • 주어진 조건에 따라 특정코드를 반복적으로 실행

    for 반복문

    while 반복문

    조건문

    제어전달문

For 반복문


  • 횟수에 의한 반복
  • for ~ in {...} in키워드를 사용해서 정해진 횟수만큼 주어진 코드블록을 반복해서 실행
  • 정의된 루프상수는 for ~ in구문에서만 사용
1
2
3
for <루프상수> in <순회 대상> {
<실행할 구문>
}
  • 순회대상: 순번을 가지는 집단 자료형 또는 범위 (배열, 딕셔너리, 집합, 범위데이터, 문자열)
  • 루프상수: 순회대상이 포함하고있는 개별아이템들을 차례로 넘겨받아 임의저장. 자동재선언
  • 실행구문: for루프에 의해 반복 실행될 구문의 범위
1
2
3
for row in 1...5 {
print(row)
}

구구단 만들기

1
2
3
for row in 1...9 {
print("3 * \(row) = \(row * 3)")
}

1992~2019년

1
2
3
for year in 1992...2019 {
print("\(year) 년도")
}

루프상수가 필요하지 않을 경우

  • 그위치에 변수나 상수가 필요하지만 나한텐 필요가없어
1
2
3
4
5
6
7
8
let size = 5
let one = "공"
var keyword = "칠"

for _ in 1...size {
keyword = one + keyword
}
print("\(keyword)")

결과: 공공공공공칠

다중루프 & 이중루프(구구단 예제)

  • 바깥루프는 19까지 순회 안쪽도 마찬가지로 19까지 순회
  • 바깥 루프가 순회할 때마다 루프 상수 i 에는 19까지 차례로 대입, 안쪽 루프가 순회할 때마다 j에도 19까지 차례로 대입
1
2
3
4
5
for i in 1...9 {
for j in 1...9 {
print("\(i) * \(j) = \(i * j)")
}
}

While 반복문


  • 조건에 의한 반복

while 구문

  • 주어진 조건이 false가 될 때까지 계속 반복
  • for~in 구문은 while 구문으로 쉽게 변경이 가능하지만 반대는 쉽지 않음
  • 조건을 만족하는 동안은 계속 실행
  • 반복횟수를 예측하기 어려운 조건에서 사용
  • 매번 시작할때 조건을 평가해서 루프를 돌지말지 결정
  • 처음부터 거짓이면 실행 X
  • 직접 실행해보기 전까지는 실행 횟수를 결코 알 수 없을 때
1
2
3
while <조건> {
<실행할 구문>
}
  • 조건은 반드시 True & False 결과로 반환해야한다.
  • 결과가 true인경우엔 코드가 반복해서 수행하지만 false경우 그즉시 종료되고 다음 구문을 실행하게 된다.

n을 2배씩 증가시키다 1000보다 커지는 순간 중지

1
2
3
4
5
var n = 2
while n < 1000 {
n = n * 2
}
print("n=\(n)")

무한루프

  • 조건대신 true를 넣으면 한없이 반복 실행되는 무한루프 탄생
  • 코드를 탈출할 수 있는 break 를 넣어주지 않으면 영원히 반복
  • 액션, 이벤트에 의해 동작하는 모바일 앱은 사용자의 액션을 기다리는 동안 입력 대기상태를 유지하는데, 앱이 종료되지 않은 채로 대기상테를 유지하기 위해 이벤트루프라고 불리는 무한루프를 만들어 실행한다.
1
2
3
while true {
...
}

repeat~while 구문

  • 일단 주어진 코드를 실행하고 다음에 다시 실행할지 말지를 조건을 통해 평가
  • 조건이 거짓이라도 최소 한 번은 실행
1
2
3
4
repeat {
<실행할 구문>
}
while <조건식>
  • n이 1000이 되기전까지 2를 했을때 (repeat~while, while의 값이 달라짐)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//while만 사용한경우
var n = 1024
while n < 1000 {
n = n * 2
}
print("n=\(n)")
//결과: n=1024

//repeat~while 사용한경우
var n = 1024
repeat {
n = n * 2
}
while n < 1000

print("n=\(n)")
//결과: n=2048
//조건식의 결과가 false할지라도 이미 n * 2 구문이 한번 실행된 상태
//반드시 한번은 실행할 필요가 있는 조건에 사용된다.

조건문


if 구문

  • 조건식의 평과 결과가 참(true)일때만 코드 블록 내부의 구문을 실행하고, 거짓(false)이라면 코드블록을 빠져나가 다음 코드를 수행한다.
1
2
3
if <조건식> {
<실행할 구문>
}
  • 조건문은 반드시 Bool타입의 참, 거짓을 판단할 수 있는 형태의 구문이여야 한다.
1
2
3
4
5
6
var c = 18
var d = 10

if c > d {
print("c는 d보다 크다")
}

if~else

1
2
3
4
5
if <조건식> {
<조건이 참일 때 실행할 구문>
} else {
<조건이 거짓일 때 실행할 구문>
}
  • if 구문과 함께 사용되어 조건식의 결과가 참이 아닐때에만 해당 블록을 실행함.
1
2
3
4
5
6
7
8
var c = 18
var d = 10

if c > d {
print("c는 d보다 크다")
} elset {
print("c는 d보다 작다")
}

if 구문의 중첩

  • if 구문은 중첩해서 사용이 가능하다.
1
2
3
4
5
6
7
8
var c = 18
var d = 10

if c > d {
print("c는 d보다 크다")
} elset {
print("c는 d보다 작다")
}

if~else if

1
2
3
4
5
6
7
if <조건1> {
<조건1이 참일 때 실행할 구문>
} else if <조건2> {
<조건2이 참일 때 실행할 구문>
} else {
<앞의 조건들이 전부 만족하지 않았을 때 실행할 구문>
}
  • else if 구문은 여러번 사용이 가능하다. 비교해야 할 값이 여러개일 때 사용하기 좋다.
  • Else 구문은 앞에서 진행된 if~else if 구문들의 조건에서 어느것도 속하지 않았을 때 실행되어야 하므로 항상 맨 마지막에 위치해야 한다.

guard 구문

  • 주어진 표현식의 결과가 참인지 거짓인지에 따라 구문의 실행 여부를 결정짓는 방식의 조건문이다.
  • if 구문과 차이는 guard구문에는 else가 필수이지만 결과가 참일 때 실행되는 블록이 없다는 점이다.
1
2
3
4
guard <조건식 또는 표현식> else {
<조건식 또는 표현식의 결과가 false일 때 실행될 코드>
return <함수의 실행을 종료하기 때문에 거의반드시 쓰임>
}
  • 코드가 실행되기 전 특정조건을 만족하는지 확인하는 용도로 사용된다.
  • guard구문의 else블록 이후엔 코드진행을 막아주는 구문이 반드시 포함되어야 하는데 return 또는 break구문이 이에 해당한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func divide(base: Int) {
guard base != 0 else { // 같음이 아닐때 참
print("연산불가")
return
}
guard base > 0 else { // (base != 0) 이 참일때 넘어옴
print("base는 0보다 커야한다.")
return
}
guard base < 100 else {
print("base는 100보다 작아야 한다.")
return
}
let result = (100/base)
print(result)
}

switch 구문

  • 입력받은 값을 조건식 여부가 아니라 패턴으로 비교하고 그 결과를 바탕으로 실행 블록을 결정하는 조건문
  • 나열된 패턴들을 순서대로 비교하다가 일치하는 첫 번째 패턴의 코드 블록을 실행한다.
1
2
3
4
5
6
7
8
switch <비교대상> {
case <pattenrn1>:
<패턴 1이 일치했을 때 실행할 구문>
case <pattern2>, pattern3>:
<패턴 2, 3이 일치했을 때 실행할 구문>
default:
<어느 비교 패턴과도 일치하지 않았을 때 실행할 구문>
}
  • 비교대상과 패턴이 일치할 경우 그에 해당하는 구문이 실행된 후 나머지 case에 대한 비교 없이 switch구문을 종료하고, swithch 구문 다음에 나오는 실행블록으로 진행한다.
  • 어느 패턴과도 일치하지 않았다면, 맨 마지막 default구문의 코드가 실행된다.
  • 일치하는 패턴이 여러개이더라도 맨 처음 일치하는 case구문 하나만 실행한다.
  • fallthrough
    • fallthrough 가 사용된 case블록은 비교패턴이 일치할 경우 인접한 case블록으로 실행흐름을 전달한다.
    • fallthrough에 의해 실행흐름을 전달받은 case블록은 비교패턴의 일치 여부와 상관 없이 작성된 구문을 실행한 후 switch구문을 종료한다.
1
2
3
4
5
6
7
8
9
10
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), \(y)이다")
}

결과: 튜플의 두 벚째 값이 3일때 첫번째 값은 2이다

  • swich구문에서 튜플 내부의 아이템이 비교 대상과 부분적으로 일치할 경우 스위프트 case구문의 비교 패턴 전체가 일치하는 것으로 간주한다.
  • 일치하지 않는 나머지 부분을 상수나 변수화 하여 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
var passtime = 1957
switch passtime {
case 0..<60 :
print("방 금 작성된 글이다")
case 60..<3600 :
print("조 금 전 작성된 글이다")
case 3600..<86400 :
print("얼마 전에 작성된 글이다")
default :
print("예전에 작성된 글이다")
}
  • 범위 연산을 사용하여 해당범위에 속하는 값을 매칭한다.
1
2
3
4
5
6
7
8
9
10
11
var value1 = (2, 3)
switch value1 {
case (0..<2, 3) :
print("범위 A에 포함되었습니다.")
case (2..<5, 0..<3) :
print("범위 B에 포함되었습니다")
case (2..<5, 3..<5) :
print("범위 C에 포함되었습니다")
default :
print("범위 D에 포함되었습니다")
}
  • 튜플의 경우 아래와 같이 원소별로 범위 연산자를 이용한 범위를 사용하여 비교가 가능하다.
1
2
3
4
5
6
7
8
9
10
var point = (3, -3)

switch point {
case let (x, y) where x == y:
print("\(x)과 \(y)은 x==y 선 상에 있습니다")
case let (x, y) where x == -y:
print("\(x)과 \(y)은 x==-y 선 상에 있습니다")
case (x, y) :
print("\(x)과 \(y)은 일반 좌표상에 있습니다")
}

제어전달문


break

  • switch 구문에선실행 흐름이나 반복 실행 중인 루프를 조건식 결과에 상관없이 즉각적으로 종료하는데 사용
  • 반복문 에서는 반복 실행 블록에 사용되어 조건식이 false를 반환하기 전에 미리 반복문을 종료하는 역할을 한다.
    • 반복문내에서 실행시 반복문의 전체실행을 즉시 종료하고 마지막에 위치한 닫는 중괄호 다음의 첫 번째 코드 줄로 실행흐름을 전달한다.
  • for~in 구문에서는 남은 아이템의 순회를 더이상 진행하지 않고 반복문을 종료한다.

continue

  • 구문 아래에 있는 실행 구문들을 건너뛰고 다음 반복을 시작하는 역할을 한다.
  • continue구문 이후 실행할 내용이 남았더라도 실행되지 않는것은 break와 같지만, break구문은 반복문이 완전히 종료하는 것과는 달리 continue구문은 아래에 있는 나머지를 실행하지 않을 뿐, 전체 반복은 유지된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var text = "This is a swift book for Apple's programming language"
var result1 = ""

for char in text.self {
if char == " " {
result1.append(Character("_"))
continue
} else if char == "o" {
result1.append(Character("O"))
continue
}
result1.append(char)
}
print(result1)

결과: This_is_a_swift_bOOk_fOr_Apple's_prOgramming_language

구문레이블

  • Break, continue구문이 어떤 구문을 멈추거나 다시 시작하게 할지 명확하지 않을때! 명확하게 표현해 줄 필요가 있다.
  • 반복문이나 조건문 등 특정 구문에 레이블을 붙여 기억할 수 있도록 하고 Break, continue 구문이 사용될 때 레이블을 명시해 줌으로써 해당 위치에 정확히 흐름제어가 적용할 수 있도록 문법을 제공한다.
1
2
3
<레이블이름> : while <조건식> {
<실행할 구문>
}
1
2
3
4
5
6
7
8
9
10
11
12
// 1에서 5까지 반복
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

  • 바깥루프, 안쪽루프에 레이블을 지정해준 다음 이를 활용해서 안쪽 루프에서 break outer를 호출하면 바깥까지 모두 종료가된다.