Swift 문법 CH.2

김성환·2020년 8월 19일
0

swift문법

목록 보기
2/11

안녕하세요. 본 포스트에서는 Swift의 흐름 제어 구문에 대해 설명하겠습니다.(c++와 같은 문법들을 다루지 않겠습니다.)

※ 참고자료 : 꼼꼼한 재은 씨의 Swift:문법편

목차

  • 1. 구문
  • 2. 반복문
  • 3. 조건문
  • 4. 제어 전달문

1. 구문

구문이란?

일반적으로 프로그래밍 과정에서 작성하는 소스코드를 구문이라고 한다.

구문의 종류

  1. 단순 구문 -> 식, 값 표현, 각종 객체의 선언, 정의 등에 사용되는 구문
    ※ swift에서는 구문의 끝남을 ;(세미클론)으로 구분을 하지 않아도 된다. 하지만 구분해도 괜찮다.
var a = 1 // OK!
var b = 2; // OK! 
var c = 3; var d = 4; // OK!
  1. 흐름 제어 구문
    -> 프로그램 실행 과정에서 실행 흐름을 능동적으로 제어하기 위한 목적으로 사용되는 구문
    즉, 순차적으로 실행되어야 할 일부 실행과정을 필요에 의해 건너뛰거나, 반복, 되돌아 오도록 흐름을 컨트롤(제어)한다는 의미이다.

흐름 제어 구문의 종류

  1. 반복문
  2. 조건문
  3. 제어 전달문

2. 반복문

반복문이란?

주어진 조건에 의해 특정 코드 블록을 반복적으로 실행할 수 있게 해주는 구문이다.
반복문의 종류에는 2가지가 있는데 첫번째가 for문 두번째가 while문이다.

for문

구간 반복을 해주는 반복문으로 swift에서는 forin 이라는 키워드를 사용한다.
(파이썬과 동일)

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 조건식

3. 조건문

조건문이란?

분기문이라고도 불리는 조건문은 프로그램에서 하나 또는 그 이상의 조건값에 따라 특정 구문을 실행하도록 프로그램의 흐름을 분기하는 역활을 한다.
즉, 조건에 따라 어느 코드부분이 실행될지 결정하는 역활을 한다고 생각하면 된다.

조건문의 종류

  1. if -> 조건식이 참과 거짓을 구분해 실행
  2. guard -> 조건식의 결과가 거짓(else만 필요)일 경우 실행
  3. switch -> 여러 비교 대상 중 특정 패턴이 되었을때 실행
if 조건식{
	실행구문
}
else if 조건식{
	실행구문
}
else{
	실행구문
}
guard 조건식 else{
	조건식의 결과가 false일 경우 실행될 구문
}

그런데 guard문은 if문으로 교체가 가능한데 왜 쓰는 것일까?

guard문은 본래 실행 흐름을 종료하기 위한 목적으로 사용되는 구문이다.
따라서 실행 흐름을 종료할때는 guard문을 쓰는 것이 효율적이다.
(전체 코드가 깔끔하고 단순해지기 때문)

switch 비교 대상{
	case 비교 패턴1 :
    	비교 패턴1이 일치했을 때 실행할 구문
    case 비교 패턴2 :
    	비교 패턴2이 일치했을 때 실행할 구문
    .
    .
    .
    default :
    	어느 비교 패턴과도 일치하지 않았을 때 실행할 구문
}

swift의 switch문과 타 언어의 switch문의 차이점

  1. break문이 필요없다. -> 패턴과 일치하는 부분만 실행한다.
  2. 암시적인 Fall Through를 지원하지 않는다. -> 명시적인 Fall through만 지원
  3. 비교 패턴 중 어느 하나라도 하나는 반드시 일치해야한다.
    (만약 일치하는 것이 없을 경우 반드시 default문을 써야한다.)
  4. 비교 패턴이 여러개 있을 수 있다. -> 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)은 일반 좌표상에 있습니다.")
}

4. 제어 전달문

제어 전달문이란?

코드의 한 부분에서 다른 부분으로 제어 흐름을 전달하여 코드가 실행되는 순서를 변경해주는 구문

제어 전달문의 종류

  1. break -> 실행 중단
  2. continue -> 실행 구문 건너 뛰기
  3. fallthrough
  4. 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구문이 사용될 때 이 레이블을 명시해줌으로써 개발자가 원하는 구문 위치에 정확히 흐름 제어가 될 수 있도록 하는 문법
즉, 특정 구문에 레이블을 붙여 개발자가 원하는 위치breakcontinue를 사용할 수 있게하는 것이라는 뜻이다.

레이블 이름 : 반복문, 조건문, ...{
	실행 구문
}

이때, 개발자가 원하는 위치(레이블)을 적용하기 위해 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
profile
개발자가 되고 싶다

0개의 댓글