[SwiftStudy 2016] 2장. Swift 타입 파트 1

22
Swift 타입 파트 1 오근현 소프트웨어 엔지니어 #Go To Swift 16 2번째 시간

Transcript of [SwiftStudy 2016] 2장. Swift 타입 파트 1

Page 1: [SwiftStudy 2016] 2장. Swift 타입 파트 1

Swift 타입 파트 1

오근현 소프트웨어 엔지니어

#Go To Swift 162번째 시간

Page 2: [SwiftStudy 2016] 2장. Swift 타입 파트 1

학습목표

• Swift의 타입에 대한 특징을 이해할 수 있다.

• Value-Type에 대해 이해할 수 있다.

• optionals 에 대해 이해할 수 있다.

Page 3: [SwiftStudy 2016] 2장. Swift 타입 파트 1

변수/상수 선언

• 변수

• 상수

• 명료한 타입은 선언 시 삭제 가능

타입 값변수명

타입 값변수명

Page 4: [SwiftStudy 2016] 2장. Swift 타입 파트 1

타입 분류

• named types

• classes, structures, enumerations, and protocols

• arrays, dictionaries, and option values

• compound types: function types and tuple types

Page 5: [SwiftStudy 2016] 2장. Swift 타입 파트 1

타입 특징

• 강한 타입

• Value-Type (물론 reference type도 있음)

Page 6: [SwiftStudy 2016] 2장. Swift 타입 파트 1

강한 타입

• 타입을 엄격하게 준수함

• 약한 타입 언어? python, javascript, C, C++, Objective-C …

• 예제: C 언어에서 아래와 같이 사용하는 것이 유효함

• char c;

• int i = c;

• 약한 타입 언어는 명확하지 않은 코드를 만들어냄

Page 7: [SwiftStudy 2016] 2장. Swift 타입 파트 1

Value-Type

• NSString 변수를 파라메터로 넘기거나 다른 변수에 할당하면 reference count가 증가

• String 변수를 파라메터로 넘기거나 다른 변수에 할당하면 아예 새로운변수가 할당되고 값을 메모리를 복사 (String의 내부 데이터는 reference count로 관리함. 지금 얘기하면 헷갈릴테니 이건 “Swift 성능의이해”에서..)

• NSString은 reference type, String은 value type

• value type은 할당할 때, 값 자체를 복사하여 source 변수와 target 변수사이의 연관성이 없음

Page 8: [SwiftStudy 2016] 2장. Swift 타입 파트 1

Value-Type 동기

• Local Reasoning

• 코드는 관련 영역만 보았을때, 이해가 되어야함

• Reference-Type을 사용하였을 경우, 함수 호출 후나 다른 쓰레드 등에서 변수의 값이 변경될 수도 있음 ==> 코드를 확인할 때 이런 부분들도 같이 확인해야함

• Performance

• Reference-Type에서 타입을 생성할때 힙에 할당하는데 힙에 할당하는 비용이 Stack에 할당하는 비용에 비해 훨씬 큼

• Reference-Type에서 다른 함수의 파라메터로 변수를 전달하는 등을 수행할때 reference count를 관리하는데 이 때 비용이 많이듦

• 자세한 것은 “Swift 성능의 이해”에서….

Page 9: [SwiftStudy 2016] 2장. Swift 타입 파트 1

Value-Type 사용

Page 10: [SwiftStudy 2016] 2장. Swift 타입 파트 1

Optionals

nilvalue

or

Page 11: [SwiftStudy 2016] 2장. Swift 타입 파트 1

optionals(계속)

• 값이 있는지 없는지를 나타내는 타입 유형

• 상자가 있고 상자 안이 비워져 있는지, 상자 안에 값이 있는지를 나타냄

• 값이 비워져 있으면 nil, 채워져 있으면 nil이 아님

• C/C++의 포인터와 유사하지만 다른 개념. 메모리 주사가 아니라값이 있고 없고의 구분임

타입 뒤에 물음표를 붙여서 표기

Page 12: [SwiftStudy 2016] 2장. Swift 타입 파트 1

optionals는 왜 있나?

• API의 성공 실패를 나타내기 위한 무수히 많은 반환값들…

• NULL, error code, BOOL, NSNotFound, -1… 등등

• API 마다 반환 값을 알아야함. 구현도 어렵고 실수하기도 쉽고 가독성도 떨어짐

• API에서 어떤 값을 얻어올때 실패하면 nil, 성공하면 nil이 아닌 값을 Type-safe하기 반환하기 위해 optionals를 사용

Page 13: [SwiftStudy 2016] 2장. Swift 타입 파트 1

optionals 예제

number 1 is not nil 만 출력

Page 14: [SwiftStudy 2016] 2장. Swift 타입 파트 1

unwrapping

• 상자 속에서 값을 꺼내오기 위해 unwrapping(까보기)함

• nil이 아닌 optional 뒤에 !(느낌표)를 붙여서 값을 얻어올 수있음

Page 15: [SwiftStudy 2016] 2장. Swift 타입 파트 1

optional binding 1: if-let

• optionals의 문제점? unwrapping을 해야하는 귀찮음

• if let “타입” = “옵셔널 타입” {}

• optional type이 nil이면 if문 조건에 들어가지 않음

• optional type이 nil이 아니면 타입에 unwrapping된 값이 할당됨

Page 16: [SwiftStudy 2016] 2장. Swift 타입 파트 1

optional binding 1: if-let(계속)

Page 17: [SwiftStudy 2016] 2장. Swift 타입 파트 1

optional binding 1: if-let(계속)

• if문은 프로그램에서 조건에 따른 논리 분기를 위해 사용

• 오류를 처리하기엔 몇가지 불편함이 있음

• 계속 계속 depth가 깊어지면서 구현의 어려움과 가독성 저하를 가져옴

• 오류를 처리하기 위한 if문인지 논리의 분기를 위한 if문인지 가독성의 문제가 있음

Page 18: [SwiftStudy 2016] 2장. Swift 타입 파트 1

optional binding 2: guard-let

• if를 대신해서 오류를 분류하기 위한 guard 구문 추가

• else가 반드시 있어야함

• return 또는 break(순환문내에서 쓰일 경우)가 반드시 있어야함

• 물론, if문 처럼 optional binding에만 쓰이지는 않음

• guard문에서 unwrapping된 값은 guard문 바깥에서도 사용 가능

Page 19: [SwiftStudy 2016] 2장. Swift 타입 파트 1

optional binding 2: guard-let(계속)

unwrapping된 값은 guard문 밖에서도 유효함

Page 20: [SwiftStudy 2016] 2장. Swift 타입 파트 1

optional chaining

• optionals를 연속하여 사용 가능

• 위의 chaining 중 하나라도 nil이면 nil이 반환되어 if문에 들어가지 못함

• optionals를 간편하게 사용하기 위한 방법

Page 21: [SwiftStudy 2016] 2장. Swift 타입 파트 1

Implicitly unwrapped optionals

• optionals의 값을 받긴 하지만 nil이 아닌 것을 내가 알고 있음

• 굳이 번거롭게 매번 unwrapping해서 사용해야하나?

• Implicitly unwrapped을 사용하여 직접 값에 접근 가능

• 제일 대표적으로 볼 수 있는 예제가 interface builder를 통해 생성한@IBOutlet 변수 ==> nil이 되면 안되고, nil이 되지 않을 것을 확신

• 사용할 땐 아래와 같이 편하게(!) 사용하면됨

• 해당 값이 nil이 되면 오류가 발생

• 귀차니즘으로 인한 unwrapping의 남발은 가독성과 안정성에 좋지 않을 수도 있음!

Page 22: [SwiftStudy 2016] 2장. Swift 타입 파트 1

?? Operation

• optional의 값을 얻어 변수를 할당할 때, ?? 연산자를 통해 할당 하려는 값이 nil인 경우의 default값을 넣어줄 수 있음

• optional value ?? default value

• optional value가 nil이 아니면 optional 안에 있는 값이 할당되고optional이 nil이면 default value가 할당