7월 12일 화요일
덥다 더워 덥무새가 되고있다. 카페가 제일 시원한듯...!
1. 함수의 반환값 (return)
먼저 Return을 알아보자! xcode에 return 이라고 치면 강조가 되는데 이 return 키워드는 swift에서 제어전송문이라고 부른다. 제어전송문에는 5가지가 있다. [continue, break, fallthrough, return, throw] 이렇게 존재한다. 그럼 return은 언제 사용할까?
- 함수의 반환형 : 오늘 배운 함수의 반환형에 사용된다. 함수 내부에 위치하며 반환형을 사용하기 위해서는 함수의 선언시에 parameter 옆에 "-> Type" 이 구문이 꼭 들어가야 한다. return을 만나면서 함수를 종료하며 함수를 호출했을 때 반환형이 있으므로 표현식, 변수로 사용가능하다.
- 조건문의 조기종료
스위프트 공식문서의 예제로 나와있는 guard let 바인딩이다. name이라는 상수에 person 변수가 담기지 않을 때 즉 nil일 때 return을 만나 func greet 함수를 종료하게 된다. 이렇게 함수의 리턴형이 없더라도 return은 함수를 종료시킨다는 공통적인 역할을 한다.
2. RawString
다음은 RawString을 알아볼 차례이다. Swift 5이후부터 지원하는 기능이며 이전에 어떤 불편함이 있어서 나오게 된 개념인지 알아보자.
위의 예시처럼 "SeSac"이라는 단어를 강조하고 싶을 때 Escape Sequence (문자열내 특수문자)를 사용해야한다. 그러나 이렇게 문자열 내에 특수문자를 많이 사용해야될 때 많은 \(백슬래쉬)를 사용하다보면 개발자입장에서 헷갈릴 수 있다. 그래서 #(확장 구분자, Extended String Delimiters)가 등장하게 되었다. 이제 Raw String의 예시를 보겠다.
이렇게 문자열 (#" "#) 앞뒤로 #을 붙여주었을 때 큰따옴표 안에 들어있는 특수문자들을 문자 그대로 인식하게 된다. 그렇다면 기존에 존재했던 \n같은 escape sequence나 string interpolation 같은 문자열의 속성, 메서드는 어떻게 사용할까?! 그 해결법은 앞뒤로 #를 붙여주었으면 \#n, \#(변수) 이렇게 #을 붙여주면 된다.
이렇게 name이라는 변수를 이용한 문자열 보간법 문법과 \n 줄바꿈 이스케이프 시퀀스를 사용하여 결과를 확인할 수 있다.
참고로 ###" 문자열 입니다."### 이렇게 앞뒤로 #, 확장구분자의 개수를 개발자의 마음대로 맞춰주기만 하면 raw string문법을 사용할 수 있다.
3. Enumeration (원시값, 연관값)
열거형, Enum 타입은 애플의 기본 타입이 아닌, 대표적인 Custom Type (Class, Struct, Enum)중 하나이다.
우리가 (.)접근연산자를 이용하여 큰 개념에서 하위 속성으로 들어가본 경험이 있다면 그 큰 개념이 Enum타입일 수 있다.
열거형의 기본 선언이다. enum 옆에는 열거형의 타입 이름을 대문자로 적어주고, 중괄호 안에 case 에는 소문자로 생성해주는 것이 관습이다. 이렇게 선언하는 것을 커스텀 타입으로 만들어주면 가독성이 좋아지고 열거형의 제일 큰 특징은 Switch문을 이용한 분기처리이다.
enum타입은 한정된 예(case)만을 갖고있기 때문에 switch문에서 default 값을 꼭 적어주어야 한다.
그럼 이제 열거형의 원시값(Raw Value), 연관값(Associated Value)에 대해서 알아보자.
- Raw Value : 열거형은 원시값이라는 속성을 통해 쉽게 사용하고 접근가능하다. 보통 Int를 자주 사용한다.
이렇게 Day 옆에 원시값의 자료형을 Int로 정해주면 case를 선언해준 순서대로 0, 1, 2, ... 차례대로 들어가게 된다.
만약 case monday = 1 이렇게 시작점을 정해주면 다음 case 부터는 원시값이 2, 3, 4, ... 차례대로 들어간다.
위의 예시처럼 문자열로 원시값을 설정해서 Day의 원시값을 이용한 접근도 가능하다. 원시값은 exhastive 하지 않기 때문에 nil을 반환할 수 있다. 그렇기 때문에 52 line 에 강제로 unwrapping 해준 것이다. 여기서 nil이 나왔기 때문에 Optional도 Swift 내부에서 Enum타입으로 정의되어있다!
이렇게 변수의 타입이 Optional 이면 Optional 열거형 안에있는 case some과 none을 이용하여 분기처리가 가능하다!
- Associated Value : 연관값은 열거형의 case마다 구체적인 정보를 튜플형태로 지정해서 저장한다.
연관값은 원시값보다 훨씬 구체적이고 깊이있는 정보를 저장하고 싶을 때 원시값을 대신해서 사용한다. 원시값과 연관값은 같이 사용할 수 없다.
연관값은 이렇게 변수를 사용하거나 열거형의 인스턴스를 생성할 때 값을 지정하고 메모리에 저장된다. 반면 원시값은 열거형을 선언해줄 때 원시값과 함께 메모리에 저장된다는 차이점이 있다.
그럼 연관값을 이용한 분기처리를 한번 확인해보자.
이렇게 열거형과 Switch 문의 case를 매치시켜 나열하는 것을 열거형 케이스 패턴이라고 부르며 패턴에는 옵셔널 패턴, 와일드 카드 패턴 같은 패턴이 여러 개있다. 패턴에 대해서는 내가 더 배워서 포스팅하겠다!
결론적으로 변수를 선언하여 열거형의 연관값을 메모리에 저장했고 switch 문의 case와 열거형의 case를 매치시켜 분기처리했다. 만약 School 이라는 열거형에 유치원이나 case가 더 들어가게 됐다면, 스위치 문에서 열거형의 모든 case와 매치시키지 않았기 때문에 default문을 적어주어야 한다. switch문은 예외를 default로 처리하기 때문이다.
- reference
https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html
Control Flow — The Swift Programming Language (Swift 5.7)
Control Flow Swift provides a variety of control flow statements. These include while loops to perform a task multiple times; if, guard, and switch statements to execute different branches of code based on certain conditions; and statements such as break a
docs.swift.org
https://jusung.github.io/RawString/
https://boidevelop.tistory.com/23