본문 바로가기

Swift26

(작성중) Extension extension은 이미 구현되어 있는 클래스, 구조체 등의 타입(+프로토콜)에 프로퍼티, 메소드를 추가하는 것이다 원본을 수정하지 않고 추가만 하게 되는데, 이를 Retroactive modeling이라고 표현한다고 한다. 그래서인지 원본 코드에 접근이 불가해도 extension은 가능하다 ◼ Extension으로 추가할 수 있는 것들을 알아보자 computed 프로퍼티 메소드 subscript new Nested Type 프로토콜 채택 🔹stored 프로퍼티는 extend할 수 없다 extension에 stored 프로퍼티가 가능하다면 타입이 요구하는 메모리 사이즈가 늘어난다 타입을 위한 메모리 사이즈를 정의하는 과정은 컴파일 타임에 이루어지는데 (효율성을 위해) extension에 따라 사이즈가 가.. 2021. 9. 21.
(작성중) Concurrency ◼ Swift에서 Asychronous & parallel 코드가 지원되며 본문에선 두 개념의 combination으로 "Concurrency"라 표현하겠다 예로, - 외부 시스템의 응답을 기다리는 동작을 병렬적으로 suspend시키고 - 메인 코드는 그대로 진행시키는 구현이 있겠다 여기서 suspend된 코드와 메인 코드를 수행하는 core가 다르며 suspend된 동작은 외부 시스템 응답이 도착하면 이어서 진행된다 ◼ 하지만, 이런 병렬성이 항상 좋진 않을 수 있음을 경고한다 느리고 후진 코드는 속도나 정확성이 오히려 떨어질 수 있고 디버깅이 어려워진다 그래서 Swift가 language-level에서 concurrency를 지원하여 컴파일 타임에 문제를 잡을 수 있도록 도와줄 것이다 🔹 NOTE S.. 2021. 9. 19.
Nested Types Swift에서는 타입 내에서 타입을 정의하는 것이 허용된다 struct BlackjackCard { // nested Suit enumeration enum Suit: Character { case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣" } // nested Rank enumeration enum Rank: Int { case two = 2, three, four, five, six, seven, eight, nine, ten case jack, queen, king, ace struct Values { let first: Int, second: Int? } var values: Values { switch self { case .ace: re.. 2021. 9. 19.
Inheritance (상속) ◼ Swift에서 상속이 가능한 타입은 클래스가 유일하며 어떤 1개 클래스는, 다른 1개 클래스를 상속할 수 있다 ◼ 자식 클래스는 subclass / 부모 클래스는 superclass라고 표현한다 ◼ subclass는 superclass의 메소드/프로퍼티/subscript를 상속받으며, 이를 재정의할 수도 있다 ◼ 상속한 프로퍼티에 대해 property observer를 추가할 수 있다 (저장프로퍼티든 계산프로퍼티든) Base Class 정의하기 ◼ 어떤 클래스도 상속받지 않는 클래스를 Base class라고 부른다 상속없는 클래스를 정의하면 자동으로 base class가 된다 예시 class Vehicle { var currentSpeed = 0.0 var description: String { re.. 2021. 9. 18.
Subscripts Subscript는 Array나 Dictionary에서 사용했던 대괄호 인덱스 [index] 접근을 말한다 직접 만든 타입에서도 subscript를 정의하여 이 접근을 구현할 수 있고 Collection의 element 추출뿐만 아니라 다양한 기능을 가질 수 있다 넣어주는 index의 타입을 달리하면 subscript를 여러개 구현할 수도 있다 또한, 여러 index를 받는 다차원 배열처럼 구현될 수도 있다 Subscript 구문 ◼ subscript라는 이름으로, 마치 메소드 구문과 계산프로퍼티 구문을 합쳐 놓은듯한(?) 형태로 구현된다 ◼ 계산 프로퍼티처럼, read-only일 경우 getter를 생략할 수 있다 ◼ setter에서 newValue를 다루어 적절한 행위를 하면 된다 subscript(.. 2021. 9. 17.
Enumerations(열거형) 열거형은 어떤 값들을 group으로 묶어 경우의 수를 제한하는 타입이다 개념적으로는 C언어의 것과 유사하나 Swift에서는 각 case에 정수 외의 String/Float 등을, 심지어 여러 개도 할당할 수 있다는 차이가 있다 연관값(associated value)이라는 개념으로 case마다 다양한 타입과 여러 개의 값을 저장시킬 수 있다 Swift의 열거형은 계산 프로퍼티, 인스턴스 메소드, 생성자 등도 사용할 수 있다 익스텐션과 프로토콜도 적용할 수 있다 목차 1. 열거형의 구문 2. 열거형 + switch문 조합 시 유의사항 3. 모든 case 루프 돌리기 4. 연관값 (Associated Value) 5. Raw Value 6. 순환 열거형 (Recursive Enumerations) 열거형 구문.. 2021. 9. 16.
Closures 클로저는 우리가 사용하거나 전달할 수 있는 기능 블럭이다 참고로, 다른 언어에도 비슷한 개념이 있는데 C언어 / Obj-C에서의 block과, 코틀린의 람다와 유사하다 클로저는 외부 상.변수의 참조를 캡쳐하여 저장할 수 있다 이를, closing over라고 표현한다 (캡쳐에 대해서는 본문에서 다룰 예정이니 넘어가자) 클로저는 함수와 같은 기능 블럭들 중 가장 포괄적인 개념이다. 함수는 일종의 special 클로저로 정의된다. (이름을 가지고 캡쳐가 없는 클로저) Swift의 클로저 표현은 깔끔하고 명확한 코드를 짤 수 있도록 최적화 기법들이 있다 parameter와 return 타입 알아서 추론하기 return이란 말을 굳이 안써도 되는 "암시적 return" shorthand 버전의 argument .. 2021. 9. 15.
Error Handling - #1/1 Optional이 값의 부재를 해결하고 Pass/Fail을 구분해주지만 에러 원인이 어느 케이스냐?를 알려주진 않는다 Representing and Throwing Errors Error handling을 구현하려면 우선 Error를 나타낼 타입을 만들어야 한다 참고로 에러 케이스를 나타낼 타입은 열거형이 딱이다 그리고, "Error"라는 프로토콜을 채택해야 하는데 사실 이 프로토콜은 비어 있고 단지 indication 용이다 enum VendingMachineError: Error { case invalidSelection case insufficientFunds(coinsNeeded: Int) //associated Value case outOfStock } 코드 Flow 도중 뭔가 예기치 않은 상황.. 2021. 9. 13.
Access Control - #1/1 다른 소스 파일, 모듈에서 우리가 짠 구조체 / 클래스 / 열거형에 접근하는걸 제한할 수 있다 (프로토콜이나 전역 상.변수도 가능한 것 같은데 더 읽어보자) 구현을 어떻게 했는지 디테일은 숨기고 싶다거나 인터페이스를 강제하는(?) 효과도 있다 참고로 entity라는 용어에 대해 잠깐 정리를 하면, 이런 access control을 적용할 수 있는 프로퍼티, 타입, 함수 등을 표현하는 것이다 Modules and Source Files Access control을 이해하려면 먼저 모듈과 소스파일의 개념을 알아야 한다 먼저 모듈은, 코드 배포의 단위이다 프레임워크나 어플리케이션이 될 수 있고 import 키워드로 또 다른 모듈에서 사용될 수 있다 (Xcode에서 하나의 app bundle이나 framewor.. 2021. 9. 13.
Basic Operators - #1/1 연산자는 값들을 확인 / 변경 / 결합하는 특별한 심볼 혹은 어구를 뜻한다 용어 정리를 잠깐 하고 넘어가자 Unary 연산자 : single target일 경우. (예)-a / !b / c! Binary 연산자 : two targets일 경우. (예) 2+3 Ternary 연산자 : three targets. (예) a ? b : c 그나마 조금은 알고 있는(?) C와 겹치는건 Skip하자 Assignment Operator : = Arithmetic Operator : +, -. *, /, % Unary Minus Operator : -three Compound Assignment Operator : a += 2 Ternary Conditional Operator : (hasHeader ? 50 : 2.. 2021. 9. 13.
Optional Chaining - #1/1 옵셔널 체이닝은 "Optional이 가진 Optional이 가진 Optiona이 가진..." 이렇게 연쇄적으로 필요한 nil check를 우아한 구문으로 바꿔주는 기법이다 예시를 보자 적용 전 //owner가 가진, home이 가진, guard가 가진, guardJob에 대한 nil check if let owner = owner { if let home = owner.home { if let `guard` = home.guard { if let guardJob = `guard`.job { print("우리집 경비원의 직업은 \(guardJob)입니다") } else { print("우리집 경비원은 직업이 없어요") } } } } 적용 후 jang?.home?.guard?.job ✅ Point Chain.. 2021. 9. 13.
Automatic Reference Counting(ARC) - #1/1 서문 Swift는 APP의 메모리 usage를 관리하고 추적하기 위해 ARC를 사용한다 그래서 대부분의 경우, 메모리는 알아서 관리되므로 고려하지 않아도 된다 ARC는 Class 인스턴스가 더이상 필요없다고 판단될때 자동으로 메모리를 해제한다 하지만 일부 케이스에선, ARC가 코드들 간의 관계에 대한 정보를 요구하기도 한다 이 예외 케이스에 대해 구체적으로 알아보고 ARC가 어떻게 메모리를 자동으로 관리하는지 살펴보자 참고로, Reference Count 라는건 참조타입인 Class의 인스턴스에만 해당된다 동작이해 Class의 인스턴스를 생성하면 ARC가 메모리를 할당하게 된다 이 메모리에는 인스턴스의 타입이나 저장 프로퍼티의 값들이 저장된다 이후에 인스턴스가 더이상 필요없다고 판단되면, 메모리 자원 활.. 2021. 9. 13.
Deinitializer - #1/1 서문 소멸자는 Class 인스턴스가 deallocate될때 호출된다 (Class 타입만 가능하다) 동작방식 개념 Swift는 인스턴스가 더 이상 필요없다고 판단되면 자동으로 메모리 해제하며 해제 되기 직전에 자동으로 소멸자를 호출한다 (해제 판단은 reference count가 0일 때이며, ARC에서 자세히 다룰 예정) 인스턴스의 메모리 관리는 ARC (Automatic Reference Counting)을 따르므로 일반적으론 cleanup을 신경쓰지 않아도 되지만 필요한 경우가 있다 예) File open 인스턴스는 deallocate 되기 전에 File close를 해주어야 한다 특징 Class 당 최대 1개 밖에 가질 수 없다 Parameter를 받지 않고 소괄호 표현도 없다 소멸자를 직접 호출할.. 2021. 9. 13.
Initialization - #2/2 생성자 Delegation for 값타입 앞서봤듯이 생성자 메소드를 여러개 구현할 수 있는데 한 생성자 내에서 다른 생성자 메소드를 호출하는 식으로 중첩사용하는 것을 "생성자 Delegation"이라 한다 목적은 중복코드를 피하기 위함이다 값타입(Struct, enum)과 참조타입(Class)간 문법이 달라서 참조타입을 위한 Delegation은 추후에 다뤄질 예정이다 Class는 상속이 가능하여 자식 Class가 부모로부터 상속받은 저장 프로퍼티까지 모두 적절한 값으로 할당되도록 책임지기 위해 상대적으로 까다롭다 구조체에서 init( )을 정의해주면 기본으로 제공되던 memberwise 생성자는 사용할 수 없게 된다 혹시 공존시키고 싶다면 init( )을 바로 구현하지말고 extension에 구현하라 .. 2021. 9. 13.
Initialization - #1/2 서문 인스턴스의 저장 프로퍼티에 초기값과 각종 초기화 과정 수행 인스턴스가 사용되기 전에 반드시 선행되어야 하는 것들을 구현 참고로, Class는 deInitializer(소멸자)도 구현할 수 있다 저장 프로퍼티 초기값 설정 개념 Struct와 Class의 저장 프로퍼티는 인스턴스가 생성될때 반드시 초기값을 가져야 한다 프로퍼티 선언부에 값을 할당할 수도 있고 / initializer에 구현할 수도 있다 참고로, 이렇게 초기값이 할당될 때는 Property Observer (willset, didset)가 호출되지 않는다 생성자 new Instance가 생성될 때 호출되는 특수 메소드 struct Fahrenheit { var temperature: Double init() { temperature = .. 2021. 9. 13.
Methods - #1/1 서문 메소드는 함수에 포함되는 하위개념. Class/Struct/enum에 포함되어 있는 함수를 메소드 혹은 클래스 함수라고 부른다. 메소드도 인스턴스 메소드 / 타입 메소드가 있을 수 있다 참고로 Objective-C를 포함한 C-like 언어에서는 Struct와 enum에서 인스턴스/타입 메소드를 만들 수 없다. Swift의 flexability 인스턴스 메소드 개념 생성된 특정 인스턴스에 대한 메소드 (=생성하지 않으면 호출불가) 구문형태는 Function와 완전히 동일하다 어떤 인스턴스 메소드든 all other 인스턴스 메소드와 프로퍼티에 별도의 작업이나 구문없이 바로 접근할 수 있다 예제 참고로 아래 예제는 참조타입인 class이므로 바로 프로퍼티 변경 또한 가능하다 class Counter .. 2021. 9. 12.
Properties - #1/1 Stored Properties (저장 프로퍼티) 특정 Class / Struct의 일부가 되는 상.변수 Default value를 부여할 수 있다 구조체를 상수로 선언하면 프로퍼티가 변수더라도 변경할 수 없다 struct FixedLengthRange { var firstValue: Int let length: Int } let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4) rangeOfFourItems.firstValue = 6​ firstValue는 변수지만 rangeOfFourItems 인스턴스 자체가 상수이므로 변경불가. 값 타입의 특징 Lazy Stored Properties 개념 iOS는 APP의 메모리 사용량이 너무 높아지면 .. 2021. 9. 12.
Structures and Classes - #1/1 서문 Swift에서는 구현한 struct와 class에 대해 별도의 인터페이스와 구현 파일을 만들 필요가 없다 단일 파일로 struct 또는 class를 정의하면 외부 인터페이스가 자동으로 다른 코드에서 사용할 수 있습니다 (당최 무슨 말인지 모르겠으니 더 읽어보자) Swift에서는 객체(object)보다는 인스턴스로 표현한다 다른 언어대비 struct와 class가 기능적으로 훨씬 가깝다 Struct와 Class 비교 Swift에서는 struct와 class간 기능적으로 유사하고 공통점이 많다 클래스의 추가 기능은 복잡성을 증가시키기 때문에 일반적으론 추론이 쉬운 Struct 사용을 선호하고 / 필요할 때 Class를 사용합니다 Struct와 Class의 공통 기능 저장 프로퍼티를 가짐 메서드 정의 가.. 2021. 9. 12.
Control Flow - #2/2 Conditional Statedments 어떤 조건에 따라 다른 코드를 실행하고 싶을 때. (예로, 에러가 발생한 경우에 메시지를 띄운다던지) if와 switch구문이 있으며, 많은 분기가 요구되지 않는 일반적인 경우 if가 사용되고 분기가 많고, 조건문이 패턴 매칭인 경우 switch가 훨씬 사용도가 좋다 If문 음.. 정리는 skip하자 Switch문 다루고 있는 value의 모든 case가 명시되어야 하고 그렇지 않으면 default를 반드시 구현해주어야 한다 (default는 항상 마지막 case로 제시될 것) (중요) 다른언어 대비 Swift에서의 switch문 특징 break를 명시하지 않아도 default로 걸린다.switch integerToDescribe { case 2, 3, 5, 7.. 2021. 9. 12.
Control Flow - #1/2 서문 Swift는 다양한 control flow 구문을 지원한다.또한, for-in구문을 지원한다. Array나 Dictionary, range 등에서 반복문을 쉽게 구현할 수 있다 while은 한 task를 여러 번 실행시키고 if, guard, switch는 조건에 따라 다른 코드 branch를 실행한다. break와 continue로 현재 실행 중인 flow를 중단하고 이동할 수 있다 특히, switch문이 독특하다. 기존의 C-like 언어대비 case정의에 있어 powerful한 차이가 있다 구간을 지정할 수 있다 튜플처럼 여러 값을 지정할 수 있다 특정 Type으로 cast할 수 있다 (이건 이해안되니 더 읽어보자) 복잡한 조건은 where라는걸 활용하면 된다는데 일단 넘어가자 For-in 시.. 2021. 9. 12.