※ 참고자료 : 꼼꼼한 재은 씨의 Swift:문법편
구문이란?
일반적으로 프로그래밍 과정에서 작성하는 소스코드를 구문이라고 한다.
구문의 종류
- 단순 구문 -> 식, 값 표현, 각종 객체의 선언, 정의 등에 사용되는 구문
※ swift에서는 구문의 끝남을 ;(세미클론)으로 구분을 하지 않아도 된다. 하지만 구분해도 괜찮다.var a = 1 // OK! var b = 2; // OK! var c = 3; var d = 4; // OK!
- 흐름 제어 구문
-> 프로그램 실행 과정에서 실행 흐름을 능동적으로 제어하기 위한 목적으로 사용되는 구문
즉, 순차적으로 실행되어야 할 일부 실행과정을 필요에 의해 건너뛰거나, 반복, 되돌아 오도록 흐름을 컨트롤(제어)한다는 의미이다.흐름 제어 구문의 종류
- 반복문
- 조건문
- 제어 전달문
반복문이란?
주어진 조건에 의해 특정 코드 블록을 반복적으로 실행할 수 있게 해주는 구문이다.
반복문의 종류에는 2가지가 있는데 첫번째가 for문 두번째가 while문이다.for문
구간 반복을 해주는 반복문으로 swift에서는 for와 in 이라는 키워드를 사용한다.
(파이썬과 동일)for 루프상수 in 순회 대상{ 반복할 구문 입력 }
이때, 순회 대상은 집단 자료형이다.(예시)->배열, 딕셔너리, 집합, 범위데이터, 문자열...
즉, 순회 대상이 루프상수 안으로 들어간다는 뜻이다.(in 이라는 키워드를 생각해보자)
for i in 1...5{ print("\(i)") }
위의 예시를 살펴보자.
순회 대상은 1...5인 범위 데이터이고 루프상수는 i 이다.
즉, for i in 1...5 의 의미는 1...5가 i로 들어간다 라는 뜻이다.
이때, 1...5가 한번에 i로 들어가지 않는다. 1부터 5까지 순서대로 i에 들어가 반복을 하게 된다.for i in "swift"{ print("\(i)") }
위의 예시는 어떻게 될까?
swift라는 문자열은 문자(Character)들이 모여 만들어진 객체이다. 즉 swift의 s,w,i,f,t는 문자(Character)라는 뜻이다. 따라서 s,w,i,f,t 순서대로 i에 들어가 반복을 하게 된다.※ 루프상수를 생략하고 싶을 경우 _(언더바)를 사용한다.
이 경우는 루프상수를 사용하지 않을 경우에 사용한다.(반복 횟수는 순회 대상 크기)
for _ in "swift"{ print("hello") }
while문
미리 정해진 구간이 없는 경우 사용하는 반복문이다. 다른 언어와 마찬가지로 while키워드를 사용한다.
while문은 조건식이 거짓일때 까지 반복한다.while 조건식{ 반복할 구문 입력 }
무한 반복 되는 구문도 있는데 while문으로 구현 가능하다.
이때, 반복문을 탈출할 수 있는 제어문(break)을 넣어 주어야 한다.while true{ 반복할 구문 }
repeat~while문
타 언어에서의 do~while문에 해당한다.
이 구문은 반복할 구문을 먼저 실행한 후 조건식을 실행하여 반복 여부를 결정한다.repeat{ 반복할 구문 } while 조건식
조건문이란?
분기문이라고도 불리는 조건문은 프로그램에서 하나 또는 그 이상의 조건값에 따라 특정 구문을 실행하도록 프로그램의 흐름을 분기하는 역활을 한다.
즉, 조건에 따라 어느 코드부분이 실행될지 결정하는 역활을 한다고 생각하면 된다.조건문의 종류
- if -> 조건식이 참과 거짓을 구분해 실행
- guard -> 조건식의 결과가 거짓(else만 필요)일 경우 실행
- switch -> 여러 비교 대상 중 특정 패턴이 되었을때 실행
if 조건식{ 실행구문 } else if 조건식{ 실행구문 } else{ 실행구문 }
guard 조건식 else{ 조건식의 결과가 false일 경우 실행될 구문 }
그런데 guard문은 if문으로 교체가 가능한데 왜 쓰는 것일까?
guard문은 본래 실행 흐름을 종료하기 위한 목적으로 사용되는 구문이다.
따라서 실행 흐름을 종료할때는 guard문을 쓰는 것이 효율적이다.
(전체 코드가 깔끔하고 단순해지기 때문)switch 비교 대상{ case 비교 패턴1 : 비교 패턴1이 일치했을 때 실행할 구문 case 비교 패턴2 : 비교 패턴2이 일치했을 때 실행할 구문 . . . default : 어느 비교 패턴과도 일치하지 않았을 때 실행할 구문 }
swift의 switch문과 타 언어의 switch문의 차이점
- break문이 필요없다. -> 패턴과 일치하는 부분만 실행한다.
- 암시적인 Fall Through를 지원하지 않는다. -> 명시적인 Fall through만 지원
- 비교 패턴 중 어느 하나라도 하나는 반드시 일치해야한다.
(만약 일치하는 것이 없을 경우 반드시 default문을 써야한다.)- 비교 패턴이 여러개 있을 수 있다. -> case 0,1,2 : 이런식으로 가능
Fall Through이란?
switch문에는 패턴이 일치하는 case 블록을 실행하는 대신, 그 다음 case 블록으로 실행 흐름을 전달하는 문법이 있는데 이를 Fall Through이라 부른다.
즉, 타 언어에서 break문을 사용하지 않고 case문을 작성할 경우 다른 case 블록으로 실행 흐름이 이동된다는 뜻이다.
밑에 c++ 예제를 살펴보자int s = 1; switch (s){ case 1: // switch문은 case 1을 실행할 것인데 break문이 없기 때문에 // fall through에 의해 실행흐름이 case 2로 이동된다. case 2: cout<<"2"; default: cout<<"일치하는 글자 없다."; }
이때, c++ 같은 경우 실행 흐름이 이동될때 fall through라는 문장이 없음에도 실행 흐름이 이동 되기 때문에 이것을 암시적인fall through 라고 하는 것이다.
밑에는 swift 예제이다.int s = 1; switch s{ case 1: case 2: print("2") default: print("X") }
위 예제의 실행결과는 오류이다.
왜냐하면 암시적인fall through 문법이 swift에는 존재하지 않기 때문이다.
따라서 실행 구문을 옮기고 싶을 경우 명시적으로 fall through를 작성해 주어야한다.int s = 1; switch s{ case 1: fallthrough// 명시적fallthrough case 2: print("2") default: print("X") } //실행결과 2
case의 비교 패턴이 여러 개인 경우
switch s{ case 0,1,2: // 비교 패턴이 0,1,2라는 뜻 fallthrough case 3...600: // 비교 패턴이 3부터 600까지라는 뜻 print("2") default: print("X") } // 비교 패턴이 튜플인 경우 switch s{ case (-1,-2): // 비교 패턴이 (-1,-2)라는 뜻 fallthrough case (1...3,5..<10): // 비교 패턴이 (1부터 3까지,5부터 9까지)라는 뜻 print("2") default: print("X") }
case문장에 조건식을 넣을 경우
where 키워드를 사용한다.
var a = (3,-3) switch a{ case let(x,y) where x == y : //이때 (x,y)는 where 조건식에 사용될 임시상수이기 때문에 let을 붙여서 상수를 선언 해야한다. print("\(x)와\(y)은 x==y 선 상에 있습니다.") 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 let(x,y) : print("\(x)와\(y)은 일반 좌표상에 있습니다.") }
제어 전달문이란?
코드의 한 부분에서 다른 부분으로 제어 흐름을 전달하여 코드가 실행되는 순서를 변경해주는 구문
제어 전달문의 종류
- break -> 실행 중단
- continue -> 실행 구문 건너 뛰기
- fallthrough
- return
break와 continue 구분
for i in 1...5{ if(i==2){ break // i가 2일때는 break이 후 실행하지 않는다. 즉, 반복문 종료 } print("\(i)") } //실행결과 1 ----------------------------------------------------------- for i in 1...5{ if(i==2){ continue // i 가 2일때는 continue 이 후 실행문장은 건너 뛴다. } print("\(i)") } //실행결과 1 3 4 5
구문 레이블이란?
반복문이나 조건문 등 특정 구문에 레이블을 붙여 기억할 수 있도록 하고, break나 continue구문이 사용될 때 이 레이블을 명시해줌으로써 개발자가 원하는 구문 위치에 정확히 흐름 제어가 될 수 있도록 하는 문법
즉, 특정 구문에 레이블을 붙여 개발자가 원하는 위치에 break나 continue를 사용할 수 있게하는 것이라는 뜻이다.레이블 이름 : 반복문, 조건문, ...{ 실행 구문 }
이때, 개발자가 원하는 위치(레이블)을 적용하기 위해 break나 continue에 해당 레이블 이름을 붙여줘야 한다.
break 레이블 이름 continue 레이블 이름
예시를 통해 살펴보자
outer : for i in 1...5{ // 바깥 for문의 레이블은 outer inner : for j in 1...9{ // 안쪽 for문의 레이블은 inner if(j==3){ break outer // j가 3일경우 바깥 for문 종료하기 위해 레이블 설정 } print("\(i)*\(j)=\(i*j)") } } //실행결과 1*1=1 1*2=2