앞에서 먼저 설명을 햇지만 다시 한번 하자면 for - in 구문은 미리 정의된 실행 횟수만큼 반복하지만, while 구문은 단순히 주어진 조건식의 결과가 false가 될 때 까지 실행 구문을 계속 반복 수행한다.
📝for - in 구문을 안보고 왔으면 보고 오는거 추천!
1. while 구문
while 문
for - in 구문과 비슷하게 코드를 반복하는 특성이 있어 종종 어떤 상황에 쓰는건지 헷갈릴때가 많다.
이해하기 쉽게 for - in 구문은 while 구문으로 쉽게 바꿀 수 있지만, 반대로 while 구문이 필요한 상황을
for - in 구문으로 바꿔서 처리하기는 쉽지 않다고 생각하면 된다.
while 문을 사용해야 하는 상황을 정리하면 아래와 같다.
- 실행 횟수가 명확하지 않을 때
- 직접 실행해보기 전까지는 실행 횟수를 결코 알 수 없을 때
- 실행 횟수를 기반으로 할 수 없는 조건일 때
// while 구문 사용 형식
while <조건식> {
<실행할 구문>
}
조건식은 반드시 참(true)나 거짓(false)의 결과값으로 반환해야 한다.
그래서 주로 비교 연산자가 사용되는 경우가 많다.
실제 코드를 보면서 이해해보자.
var n = 2
while n < 1000 {
n *= 2
}
print("n = \(n)")
위 코드는 초기에 주어진 n의 값 2를 계속해서 2배씩 증가시키다가 1000보다 커지는 순간 무한 루프를 중지하는 코드다.
반복 실행할 기준이 횟수가 아니라 조건이기에 조건문만 본다면 변수 n에 입력될 값을 미리 알 수 없다.
조건을 보자면 n의 값이 1000보다 작을때가 조건인거다.
😡 : 조건이 n의 값이 1000보다 작을때가 조건인데 왜 n의 값이 1000보다 높아?
라고 생각하는 사람은 없겠지만 혹시나 하는 생각에 설명을 하자면, while문의 조건식은 반드시 참과 거짓으로만 이루어 져야 한다.
자 그럼 아래의 그림을 보자.
while문의 조건식은 처음에 2로 시작하기에 참(true)에 있다
n(2) = 2 , n(4) = n(2) * 2 , n(8) = n(4) * 2 . . . . n(512) = n(256) * 2
위 처럼 while문은 조건을 따져 봤을때 512 < 1000 가 참(true) 였기 때문에 while문을 끝내지 않았고 한번 더 실행을 한 것이다.
그리고 나서 확인을 했을때 n이 1024로 1024 < 1000 거짓(false)로 반환이 되기에 while문은 멈추고 n이 1024인 시점에 출력이 되 아래와 같이 결과값이 나온 것 이다.
📝 이런 느낌인거지
🖥 : n 너 지금 몇이야?
🙂(n) : 나 지금 512
🖥 : 지금은?
🙂(n) : 나 지금 1024
🖥 : 뭐야 1000 넘었잖아? while 문 멈춰😡
while 구문에 조건식 대신 true 값을 직접 넣으면 어떻게 될까?
말 그대로 무한 루프가 만들어 진다. 코드 블록을 탈출할 수 있도록 break 문을 넣어주지 않는다면 프로그램은 프로세스가 종료되지 않는 한 영원히 실행 블록을 반복하게 되는 것 이다.
// 무한 루프 예시
while true {
...
}
대부분 무한 반복되는 코드는 문제가 되곤 하지만, 언제다 그런건 아니다.
터치나 클릭 등 사용자의 액션과 이벤트에 의해 동작하는 모바일 앱은 특성상 사용자의 액션을 기다리는 동안 입력 대기 상태를 유지하는데, 앱이 종료되지 않은 채로 대기 상태를 유지하기 위해 *이벤트 루프라고 불리는 무한 루프를 만들어 실행한다.
이론상 무한 루프는 영원히 반복되기 때문에 앱을 종료시키지 않고 유지할 수 있다.
이때 무한 루프를 만들기 위해 while 구문이 사용된다.
📝 이벤트는 의미 있는 특정 사건에 발생하는 것을 말한다.
사용자가 버튼을 클릭하는 사건, 사용자가 화면을 위아래로 미는 사건, 특정 영역을 손가락으로 터치하는 사건 등
repeat - while 문
repeat -while 반복문은 나도 공부하면서 처음 들어봤다 이런게 있었어??
알아보니깐 다른 언어에서는 do - while 구문에 해당하는 것 이라고 한다.
tmi로 스위프트 2.0 버전부터 새롭게 추가했는데 정확히는 초기 버전의 스위프트에서 do - while 구문으로 발표되었던 것이 스위프트 2.0 버전에서 repeat - while 구문으로 변경되었다고 한다. 암튼 그렇다고 알아두자.
// repeat - while 구문 사용 형식
repeat {
<실행할 구문>
}
while <조건식>
📝 뭐야 그냥 do - while 문 이잖아..? do -> repeat로 바뀐거 말고는... 쩝 🙃
설명을 하자면 조건식을 먼저 평가하여 실행 블록의 수행 여부를 결정하는 while 구문과 달리 repeat - while 구문은 코드 블록을 일단 실행한 다음에 조건식을 평가하여 반복 여부를 결정한다.
repeat -while 구문은 실행 블록의 수행을 최소 한 번은 보장하는 특성을 가지고 있다.
이것이 while 구문과 결정적인 차이점이다.
코드로 직접 차이점을 알아보자.
// while문 코드
var n = 1024
while n < 1000 {
n *= 2
}
print("n = \(n)")
변수 n의 값을 1024로 입력한 다음 반복문을 실행하면 주어진 조건식 n < 1000 에 만족하지 못하므로 false가 반환이 된다. 따라서 while 문 안에 있는 구문은 한 번도 실행되지 않은 상태로 반복문이 종료되고 n값은 아무런 변화도 없이 출력된다.
// repeat - while문 코드
var n = 1024
repeat {
n *= 2
}
while n < 1000
print("n = \(n)")
같은 조건이지만 n의 최종값이 다른걸 볼 수 있다. repeat - while 구문은 실행 블록이 한 번 수행된 상태에서
조건식을 평가하므로 비록 조건식의 결과가 false라 할지라도 이미 n *= 2 구문이 한 번 실행된 상태다.
따라서 n에 할당된 값은 2048이 된다.
이처럼 repeat -while 구문은 while 구문을 사용해야 하는 조건 중에 반드시 한 번은 실행할 필요가 있는 조건에 사용된다.
'메모장' 카테고리의 다른 글
Swift 변수와 상수 2 (2) | 2023.03.02 |
---|---|
Swift 변수와 상수 1 (1) | 2023.03.02 |
Swift 반복문 [ for - in 편 ] (5) | 2023.02.27 |
Swift 와 Objective-C 차이 (4) | 2023.02.27 |
Swift 기능/특징 (1) | 2023.02.26 |