반응형

제어 구문은 복잡한 프로그램을 작성하는데 있어서 필수적인 것이다. if, switch for, while. 이러한 4가지 기본 구문에 대해 여기서 정리하여 설명한다.


if 문에 의한 조건 분기

이번에는 Swift의 제어 구문에 대해 설명하겠다. 제어 구문은 조건 분기와 반복으로 구성된다. 우선 조건 분기의 기본이다 if문부터 설명하겠다.

이미 다른 프로그래밍 언어를 경험한 사람이라면 if문이 무슨 뜻인지 알고 있을 거다. 이것은 조건에 따라 수행할 작업을 설정하는 것이다. 이 if문은 다음과 같이 작성한다.

if문의 기본형 (1)

if 조건문 {
    ...... 조건이 옳았을 처리 ......
}

if문의 기본형 (2)

if 조건문 {
    ...... 조건이 옳았을 처리 ......
} else {
    ...... 조건이 틀렸을 때 처리 ......
}

if문 이 후에 조건문을 작성한다. 이는 기본적으로 "사실 값으로 얻을 수 있는 것"이라면 어떤 것이라도 작성할 수 있다. 값, 변수, 수식, 함수나 메소드 등이 해당된다. 다른 언어의 경험이 있으면, 바로 "조건은 괄호로 둘러싼다"라고 생각할 수 있는데, Swift의 경우 괄호는 없어도 된다. 물론 있어도 괜찮다.

if (x == 0) {...}
◯ if x == 0 {...}

또한 조건 후에 수행할 작업과 else 다음에 수행할 작업 부분은 반드시 {} 기호로 묶어야 한다. 다른 언어에서는 한문장 밖에 처리가 제공되지 않는 경우는 {}를 생략할 수도 있지만, Swift는 반드시 {}가 필요하다.

else if 대해

조건이 성립하지 않으면 else에 if를 붙여 "else if"로 다음과 조건문을 이어서 계속 쓸 수 있다. 아래와 같은 방식이다.

if 조건문 {
    ...... 처리 ......
} else if 조건문 {
    ...... 처리 ......
} else if ...... 필요한 만큼 계속 쓴다 ......

}

이 경우에도 "else if"가 성립되지 않으면, else를 붙이거나 거듭해서 "else if"를 다음의 조건문으로 작성할 수 있다.



switch 문에 의한 여러 분기

if는 부울값으로 조건을 확인하기 위해, 양자 택일의 형태밖에 처리를 분기할 수 없었다. 값을 확인하고 다수의 분기할 수 있도록 하는 것이 "switch"문이다.

switch는 체크하는 값을 준비하고, 그 값에 따라 처리 부분에 점프하는 동작을 한다. 이것은 다음과 같이 작성한다.

switch 문장의 기본

switch 체크 값 {
case 값 :
    ...... 수행 할 작업 ......
case 값, 값 ... :
    ...... 수행 할 작업 ......

default :
    ...... 다른 경우의 처리 ......
}

체크 값

switch문 이후에 체크하는 값을 작성한다. 이것은 값, 변수, 수식 등 값으로 취급할 것이면 무엇이든 작성할 수 있다. 이 값의 부분도 괄호는 없어도 된다 (붙여도 상관없다).

체크하는 값은 숫자, 텍스트, 논리값 어떤 것도 사용할 수 있다.

case

case에는 값을 작성한다. 그러면 switch 마련한 값이 case 값과 일치하는 처리를 실행되게 된다. 이 case에는 값을 여러개를 작성할 수 있다. 이 경우 콤마(,)로 값을 계속 작성할 수도 있다.

많은 언어에서는 case가 수행하는 작업의 마지막 구문을 빠져 위한 지침을 제공하지만 swift 필요없다(예로 break등 있다). swift에서는 case에 있는 모든 처리를 수행하면, 다음의 case 전에 자동으로 구문을 빠져 나오게 된다.

default

switch의 마지막에는 반드시 default:를 준비해야 한다. 이것은 모든 case에 일치하는 항목이 없는 경우의 처리이다. 많은 언어에서 이는 선택 사항이지만, swift의 경우 반드시 준비하는 것이 기본이다.

range 의한 범위 지정

case에는 여러 값을 지정할 수 있지만, 값이 방대해 지면 일일이 쓸 수 없게 된다. 이러한 경우에 편리한 것이 "range"연산자를 사용하여 범위 지정이다. 이것은 다음과 같이 작성한다.

최소값 ... 최대값
최소값 ..< 최대값

range를 사용하여 최소값에서 최대값까지의 범위의 모든 값을 지정할 수 있다. "..."는 최소값에서 최대값까지 ".. <"는 최소값에서 최대값 미만 (최대 값은 포함되지 않음)를 범위로 지정할 수 있다.

아래에 range를 이용한 switch에 대한 예제는 아래와 같다.

var x = 300
 
switch x {
case 0:
    "zero"
case 1...9:
    "1번"
case 10...99:
    "2번"
case 100...999:
    "3번"
default:
    "없다"
}

이런 식으로, range를 이용해서 수치에 대한 범위를 정하여 분기 처리를 쉽게 할 수 있다.



for 문에 의한 반복

이어서 반복문이다. 반복에는 몇가지 문법이 준비되어 있다. 가장 많이 사용되는 것은 "for" 문이다. 이것은 두 가지 형태로 되어 있다. 각각 정리하자면 아래와 같다.

for in의 기본형

for 변수 이름 in 여러 요소와 값 {
    ...... 반복 처리 ......
}

이것은 배열이나 range처럼 여러 값을 모은 것을 이용하여 반복한다. for의 변수 명을 준비하고 in 후 배열이나 range 값을 작성한다. 이후에 {} 내에 반복 처리를 작성한다.

for는 in 이후에 배열 등 순서대로 값을 꺼내어 for 변수에 할당하고 처리를 수행하는 작업을 모든 요소에 대해 반복한다. 예를 들어, 1에서 10까지 값을 변수로 설정하고 실행한다면 아래와 같이 작성된다.

for index in 1...10 {...}

또한, 순서대로 추출 값은 따로 사용하지 않는 경우에는 변수 이름을 언더스코어(_)로 할 수도 있다. 아래와 같이 작성된다.

for _ in 1...10

이렇게 하면 10회 반복 처리를 만들 수 있다.

for 기본형

for 초기화 처리; 조건; 후 처리 {
    ...... 반복 처리 ......
}

이것은 더 세세하게 반복하고 싶은 경우에 사용한다. for 후에는 초기화 처리, 조건, 후 처리의 3 가지 요소가 있다.

요소설명
초기화 처리반복을 시작하기 전에 수행할 처리을 작성한다.
조건반복할 때마다 이 조건을 확인한다. true이면 반복하고, false이면 구문을 빠져 나간다.
후 처리반복 처리를 실행 후, 여기에 준비한 처리를 수행하고 다음 반복으로 진행한다.

이런 for 문이 언어의 경험이 있으면 더 친숙한 것이다. 대부분의 경우 초기화로 변수를 초기화하고, 후 처리에서 그 값을 증감시켜 반복을 수행시키도록 한다. 예를 들면, 아래와 같은 방식이다.

for var i = 0; i <10; i ++ {
    "index :"+ String (i)
}

여기서 변수 i를 초기화하고, 그 값을 0에서 10까지 카운트하면서 반복을 실행한다. 반복은 String(i)라고하는 것은 이전에 전했었다. 텍스트로 형변환하는 처리이다.

이것으로 일단 반복 처리가 실행된다. 그저 이것이라면 for in에 range를 사용하여 쓴 편이 알기 쉬울 것이다. 일부러 이 for를 사용하는 이점은 별로 느껴지지 않을지도 모르겠다.

여기 for는 후 처리 및 조건을 자유롭게 작성할 수 있는 것이 장점이다. 예를 들어, "변수를 2씩 늘려간다"라는 것도 쉽게 할 수 있다. 단순히 1씩 값을 늘려 간다면 for in이 좋지만, 좀 더 정교한 것을 처리하고 싶은 경우는 여기에 for가 편리하다.



while 문에 의한 반복

for는 반복마다 변화하는 장치가 구문에 있다. 하지만, 더 간단하게 조건을 확인하고 반복 여부를 결정만 하는 단순한 반복 구문도 있다. 그것이 while 문이다.

while은 조건이 붙는 위치에 따라 두 가지 방법이 있다. (후자는 do while 문이라고 하기도 한다).

while의 기본형

while 조건 {
    ...... 반복 처리 ......
}

do while의 기본형

do {
    ...... 반복 처리 ......
} while 조건

while 이 후에 조건이 되는 것을 작성한다. 이 조건이 true이면 반복을 실행하고, false가 되면 반복을 빠져 나가는 간단한 구조이다.

간단하면서도 왜 2개의 작성법이 있는가. 그것은 조건을 체크하는 타이밍의 차이이다. 전자(구문 최초에 while이 있는 것)은 먼저 while 뒤에 있는 조건을 확인하고 그것이 true라면 다음 {} 부분을 실행한다.

후자(구문의 마지막에 while이 있는 것)은 반복 수행하는 {} 부분을 먼저 실행하고 끝나고 나서 while 조건을 확인한다. 결국은 처음부터 조건이 false하더라도 반드시 한번은 {} 부분을 실행하게 된다.

예를 들어, 간단한 반복을 비교해 보자

var n:Int = 0
 
while 10 > n++ {
    "index:" + String(n)
}
 
var m:Int = 0
do {
    "index:" + String(m)
} while 10 > m++

전자는 index:1 ~ index:10 형태로 값을 얻을 수 있다. 반면 후자는 index:0~index:9 형태이다. 조건문에 ++로 변수를 증가 시키고 있기 때문에, 조건이 앞에 있는지 뒤에 있는지에 따라 숫자가 벗어난다.

이런 식으로 섬세한 동작을 보면 양자는 미묘하게 달라진다. 개인적으로는 기본은 while에서 작성, do while은 특별한 사정이 있는 경우에만 사용할 것이라고 생각두면 좋은 것 같다.


반응형

'Swift' 카테고리의 다른 글

[Swift] 배열과 사전  (0) 2017.12.09
[Swift] 클래스 기본  (0) 2017.12.09
[Swift] 함수  (0) 2017.12.09
[Swift] 제어 구문  (0) 2017.12.09
[Swift] 값, 변수, 연산  (0) 2017.12.09
[Swift] Swift 사용 준비하기  (0) 2017.12.09

+ Recent posts