2014년 6월 11일 수요일

Swift - 루프(Loop)

루프는 특정 코드를 반복해서 실행하기 위해 제공하는 모든 언어들이 갖추고 있는 기능이다. 스위프트도 당연히 비슷한 기능을 비슷한 이름으로 제공한다.

루프의 특징이 있다면 논리식을 기반으로 한다. 즉, 루프를 무한정 도는게 아니라 특정한 조건을 만족할 때만 루프를 실행한다. 물론 무한루프라 불리우는 기법도 있지만 이는 탈출 방법을 반드시 제공해야 한다는 점을 기억하자.

[관련글] Swift - 논리 제어문(Conditional Statements)

for 루프

for 문은 일반적인 C 방식과 for - in 같은 현대적인 방식 두 가지를 사용 할 수 있다. 우선은 C방식을 보자.
for var i = 0; i < 10; i++ {
    println(i)        // 0 에서 9 까지 출력
}
문법에서 괄호가 사라진게 눈에 띄일 것이다. 근데 사실 스위프트는 C와 동일한 문법으로도 for문 사용이 가능하다.
for (var i = 0; i < 10; i++) {
    println(i)        // 0 에서 9 까지 출력
}
편한 방법을 사용하자. 개인적으론 괄호 입력 수고를 덜어주는 스위프트 방식이 마음에 든다.

물론 현대적인 이터레이션 방식의 문법(for ~ in)도 지원한다. 아래는 Range 를 이용해 0 에서 9 까지 숫자를 찍는 코드이다.
for i in 0...9 {
    println(i)
}

for i in 0..<10 {    // 0 based index range
    println(i)
}
업데이트: '..<' 키워드는 Xcode 6 Beta 3 부터 도입되었다.

가독성 높은 좋은 코드의 탄생이다. 그런데 var 등의 변수 선언 문구가 전혀 쓰이지 않았다는 점에 주목하자. 넣으면 오히려 에러가 발생한다. :-)

다만 현 시점에서는 Range 이터레이션 방식의 루프는 단순 변수 증가형과 비교해서 성능이 약간 떨어지는 편이다. (관련글: Swift 루프 퍼포먼스 테스트)

Range를 활용한 이터페이션에서 변수가 딱히 필요없다면 빼 버릴 수도 있다.
for _ in 0...9 {
    println("TEST")
}
이렇게 하면 TEST 라는 문자가 10번 찍힌다.

지금까지는 Range 만을 활용했지만 Array나 Dictionary 등의 컬렉션 타입의 이터레이션도 물론 가능하다.
for i in [ 0, 1, 2, 3, 4 ] {
    println(i)
}
0 에서 4 까지 숫자가 표시되는 코드다.

[관련글] Swift - 컬렉션 타입(Collection Types)

while 루프

while 문도 타 언어와 동일하다. 초기화가 없고 증가식이 없는, 순수 논리식만이 조건으로 들어가는 루프를 만들 수 있다.
var i = 0
while i < 10 {
    println(i)
    i++
}
논리조건식으로 Bool 타입이 와야 한다는 것에 주의하자.

[관련글] Swift - 논리 제어문(Conditional Statements)

do - while 루프

역시나 타 언어와 똑같은 do - while 문이다. while 과의 차이점은 논리식의 여부에 관계없이 최소한 한 번은 실행된다는 점이다.
var i = 0
do {
    println(i)
    i++
} while i < 10
최소 한 번은 실행된다는 것만 기억하면 while 문을 써야 할 때와 do - while 문을 써야 할 때를 구분 할 수 있을 것이다.

무한루프 (Infinite Loop)

무한루프라는건 사실 비권장 사항이긴 하다. 하지만 굉장히 유용하게 쓰이기도 한다.

이름처럼 루프를 무한으로 도는 코드를 무한루프라 칭하는데, 무조건 무한으로 만들면 안된다는 것도 알아두자. break 문을 이용해 탈출하는 것을 만들어 두지 않으면 프로그램이 영원이 루프를 돌게 되니 과부하를 일으키거나 종료가 안되는 등의 문제가 발생한다.

무한루프는 여러가지 방법으로 만들 수 있다. 아래 예제는 while, do - while, 그리고 for 문을 이용해 무한루프를 만드는 코드이다.
while true {
    ...
    if someCondition { break }
}

do {
    ...
    if someCondition { break }
} while true

for ; true ; {
    ...
    if someCondition { break }
}
루프 코드야 마음대로 만들면 되지만 반드시 탈출(break) 조건을 만들어 두는 것을 잊지 말자.

무한루프를 만드는 권장 사항은 위 처럼 무조건 조건식을 true로 하지 않는 것이다. 보통 스레드 등에서 많이 쓰이는 런루프(Run Loop)는 아래와 같은 식이다.
while !cancelled {
    ...
}
위 코드는 실제 동작하는 코드는 아니고, NSThread나 NSOperation 에서 제공되는 cancelled 프로퍼티를 이용하는 것 처럼 만든 Pseudo-Code다. 형식이 이렇다는 것을 보여주기 위한 용도다. 필요하다면 직접 cancelled를 true로 세팅하거나 혹은 해당 클래스에서 제공되는 방법을 사용해서 중지시키도록 만들거나 등등 사용하는 분야에 따라 조금씩 다르다.

[돌아가기] 스위프트(Swift) 가이드
[관련글] Swift - 순차적 타입(Sequence Type) 만들기

댓글 없음 :