아요 개발 일기
[Swift] 반복문 (Loop Statements) - For 문, While 문 본문
반복문은 주어진 조건에 의해 특정 코드 블록을 반복적으로 실행할 수 있게 해주는 구문입니다.
프로그래밍에서 코드 블록의 반복을 루프(Loop)라고 부르고 반복되는 횟수를 루프 횟수라고 부릅니다.
반복문은 두 가지 방식으로 나눌 수 있습니다.
- For 반복문 : 횟수에 의한 반복
- While 반복문: 조건에 의한 반복
- While 구문 : 매번 루프를 시작할 때 조건식을 평가하여 루프를 돌지 말지 결정합니다.
- repeat ~ while 구문 : 루프를 완료할 때마다 조건을 평가하여 다음 루프 실행 여부를 결정합니다. ( 일단 주어진 코드 블록을 실행한 다음에 다시 한 번 루프를 실행할지 말지를 조건식을 통해 평가)
1. For 반복문
For 반복문은 in 키워드와 함께 사용되어 정해진 횟수만큼 주어진 코드 블록을 반복해서 실행합니다.
먼저, 구문의 형식을 살펴봅시다.
for <루프 상수> in <순회 대상>{
<실행할 구문>
}
기본적으로 이 구문을 실행하기 위해서는 세 개의 항목이 필요합니다.
- 루프 상수 : 구문이 반복될 때마다 순회 대상이 포함하고 있는 개별 아이템들을 차례로 넘겨받아 임의로 저장하고, 실행 블록 내에서 사용할 수 있도록 해주는 역할 ( 이 객체는 루프 구문이 순회할 때마다 자동으로 재선언되므로 let 키워드를 사용하여 직접 선언할 필요가 없다는 점 유의)
- 순회 대상
- 실행할 구문
여기서 가장 중요한 것은 순회 대상 입니다.
순회 대상은 주로 순번을 가지는 집단 자료형이나 또는 범위를 가지는 데이터 등이 사용되는데,
이 대상의 길이나 포함하고 있는 아이템의 개수만큼 구문이 반복 수행됩니다.
순회 대상으로 사용할 수 있는 데이터 타입에는 다음과 같은 것들이 있습니다.
- 배열(Array)
- 딕셔너리(Dictionary)
- 집합(Set)
- 범위 데이터 : 범위 연산자에 의해 규칙적인 간격으로 나열된 정수들의 모음
- 문자열(String) : Character 타입의 데이터들이 모여 이루는 집단적 성격의 데이터
범위
a...b - a부터 b까지 포함
a..<b - a부터 b-1까지
예시를 통해 좀 더 살펴보도록 하겠습니다.
1-2. 문자열의 문자 순회
String 타입 자체는 순회 처리를 지원하지 않으므로 characters속성을 사용해야 합니다.
아래 코드는 문자열의 크기만큼 총 5회 반복됩니다.
var lang = "swift"
for char in lang.characters{
print("개별 문자는 \(char)입니다.");
}
1-3. 루프 상수 생략
언더바(_)를 사용하여 루프 상수를 생략할 수 있습니다.
let size = 5
let padChar = "0"
var keyword = "3"
for_in 1...5 {
keyword = padchar + keyword
}
print("\(keyword)")
출력값
000003
위 코드는 size 값만큼 keyword 문자열의 왼쪽에 0을 채워 넣는 구문입니다.
주어진 값이 5까지이므로 1부터 5까지 모두 5회에 걸쳐 루프가 실행되며, 매 실행마다 왼쪽에 0이 추가됩니다.
이 구문에서는 루프 상수가 굳이 필요하지 않습니다.
따라서 루프상수 자리에 언더바로 대신하였는데, 변수나 상수가 들어가야 할 자리를 언더바로 채우는 것은 스위프트에서 다음과 같은 의미를 가집니다.
" 그 위치에 뭔가 변수나 상수가 필요하다는 건 알지만, 우리에겐 필요가 없어요,
그러니 그냥 생략할게요. 실수로 빠트렸다고 생각 할까봐 표시는 해두었으니 문법이 틀렸다는 오류는 내지 마세요."
1-.3. for~in 구문의 중첩(다중 루프)
for~in 구문 내에 또 다른 for~in을 작성하여 사용할 수 있다는 뜻입니다.
이러한 형태를 흔히들 다중 루프라고 부르는데, 특히 두 개의 루프 구문이 중첩된 코드를 별도로 이중 루프라고 부릅니다.
다중 루프를 효과적으로 사용하면 굉장한 시너지 효과를 낼 수 있지만, 반대로 코드의 해석을 난해하게 만드는 주범이 되기도 하므로 주의해서 사용해야 합니다.
for i in 1..<10 {
for j in 1..<10 {
pring("\(i) x \(j) = \(i * j)")
}
}
2-1. while 반복문
while 구문은 단순히 주어진 조건식의 결과가 false가 될 때까지 실행 구문을 계속 반복 수행합니다.
'조건이 만족하는 동안은 계속 실행' 된다고 생각하시면 됩니다.
while문을 사용해야 하는 경우는 다음과 같습니다.
- 실행 횟수가 명확하지 않을 때
- 직접 실행해보기 전까지 싱행 횟수를 결코 알 수 없을 때
- 실행 횟수를 기반으로 할 수 없는 조건일 때
while 구문의 사용 형식
while <조건식> {
<code block>
}
while 키워드 다음에는 조건식이 사용되는데, 조건식은 반드시 참(true)이나 거짓(false)을 결과 값으로 반환해야 합니다.
그래서 조건식에 주로 연산자가 사용되는 경우가 많습니다.
조건식이
- true 일때 - 실행 블록 내의 코드가 반복해서 수행
- false 일때- 즉시 반복문의 실행은 종료되고 코드 블록을 빠져나가 바로 다음에 이어지는 구문을 실행
var n = 2
while n < 1000 {
n = n * 2
}
print("n = \(n)")
출력 값
n = 1024
while 구문에 조건식 대신 true값을 직접 넣으면 한없이 반복 실행되는 무한 루프가 만들어 집니다.
코드 블록을 탈출할 수 있도록 break 문을 넣어주지 않는다면 이 프로그램은 프로세스가 종료되지 않는 한 영원히 실행 블록을 반복하게 됩니다.
while true {
<실행 코드>
}
2-2. repeat~while 구문
repeat~while 반복문은 다른 언어에서 do~while 구문에 해당한다고 생각하시면 됩니다.
while 구문의 사용 형식
repeat {
<실행할 구문>
}
while<조건식>
조건식을 먼저 평가하여 실행 블록의 수행 여부를 결정하는 while 구문과 달리 repeat~while 구문은 코드 블록을 일단 실행한 다음에 조건식을 평가하여 반복 여부를 결정합니다.
이에 따라 repeat~while 구문은 실행 블록의 수행을 최소 한 번은 보장하는 특성을 가지는데, 이것이 while 구문과의 결정적 차이점입니다. while 구문은 조건식을 먼저 평가하여 false가 반환되면 실행 블록을 아예 수행하지 않으니까요.
간단히 정리하면,
- while 구문 - 한 번도 실행 안 될 수도 있음
- repeate~while 구문 - 무조건 한번은 실행 됨
아래 코드를 보면서 좀 더 이해해보록 하겠습니다.
var n = 1024
// while 문
while n < 1000 {
n = n * 2
}
print ("n = \(n)"
실행 결과
n = 1024
------------------------------------------------------------------------
//repeat~while 문
var count = 0
repeat {
n = n * 2
count = count + 1
}
while count < 5
print("n = \(n)")
print("count = \(count)")
실행 결과
n = 2048
count = 5
위 예제를 보면 동일한 코드를 실행하였는데, while구문과 repeat~while 구문의 결과 값이 다르게 나왔습니다.
결과 값이 다르게 나온 이유가 무엇일까요?
위에 설명했던 것과 같이 repeat~while은 무조건 한 번은 실행되기때문에 결과 값이 2048이 나온 것을 알 수 있습니다.
이와 같이,
repeat~while 구문은 while 구문을 사용해야하는 조건 중에서 반드시 한 번은 실행할 필요가 있는 조건에 사용됩니다.
'Swift > Grammar' 카테고리의 다른 글
[Swift] guard(feat. if문) & assert (0) | 2022.12.30 |
---|---|
[Swift] Optional ( 옵셔널 ) (0) | 2022.12.30 |
[Swift] Any와 AnyObject (0) | 2022.12.30 |
[Swift] 타입 추론(Type inference)과 타입 어노테이션(Type annotation) (0) | 2022.12.30 |
[Swift] 집단 자료형 - Array, Dictionary, Set , Tuple (0) | 2022.12.30 |