본문 바로가기

Swift Language

Swift Language - 25 - 고급 연산자 (Advanced Operators) 접두, 접미 연산자 (Prefix and Postfix Operators) extension Vector2D { static prefix func - (vector: Vector2D) -> Vector2D { return Vector2D(x: -vector.x, y: -vector.y) } } // 아래 코드를 수행하면 2차원 좌표가 음수로 변한 것을 확인할 수 있습니다. let positive = Vector2D(x: 3.0, y: 4.0) let negative = -positive // negative is a Vector2D instance with values of (-3.0, -4.0) let alsoPositive = -negative // alsoPositive is a Vector2D i.. 더보기
Swift Language - 24 - 접근제어 (Access Control) 접근제어는 특정 코드의 접근을 다른 소스파일이나 모듈에서 제한하는 것입니다. 이렇게 접근제어를 함으로써 특정 코드의 세부적인 구현을 감추고 딱 필요한 만큼 공개해 다른 곳에서 사용할 수 있도록 합니다. 접근제어는 클래스, 구조체, 열거형 등 개별 타입에도 적용할 수 있고 그 타입에 속한 프로퍼티, 메소드, 초기자, 서브스크립트에도 적용할 수 있습니다. 프로토콜은 그래서 전역상수, 변수, 함수같이 특정 문맥에 종속됩니다. Swift에서는 기본 접근레벨을 제공해 접근레벨의 처리를 쉽게할 수 있도록 돕습니다. 그래서 사실 단일타겟의 앱에서는 특별히 접근레벨을 전혀 명시하지 않아도 됩니다. 모듈과 소스파일 (Modules and Source Files) Swift의 접근제어는 모듈과 소스파일에 기반을 두고 있습.. 더보기
Swift Language - 23 - 메모리 안정성 (Memory Safety) 기본적으로 Swift는 코드가 비정상 적으로 동작하는 것을 막는 행위를 합니다. 예를 들면, 변수가 초기화 되기 전에 사용된다던가, 메모리에서 해제된 값을 접근하는 것을 막는 다던가, 인덱스의 한계를 넘는지 확인한다는 것 들이 그것 입니다. Swift에서는 또 메모리의 같은 영역을 동시에 접근해서 충돌이 나지 않도록 해줍니다. 이렇듯 Swift에서 메모리 관련해 자동으로 관리해 주기때문에 대부분의 경우에는 Swift언어를 사용하는 사용자는 메모리의 접근에 대해 전혀 생각하지 않고 사용해도 됩니다. 하지만 메모리 접근 충돌이 발생할 수 있는 잠재적인 상황을 이애하고 메모리 접근 충돌을 피하는 코드를 어떻게 작성할 수 있는지 이해하는 것은 중요합니다. 만약 메모리 접근 충돌이 일어나면 런타임 에러나, 컴파일.. 더보기
Swift Language - 22 - 자동 참조 카운트 (Automatic Reference Counting) Swift에서는 앱의 메모리 사용을 관리하기 위해 ARC(Automatic Reference Counting)을 사용합니다. 자동으로 참조 횟수를 관리하기 때문에 대부분의 경우에 개발자는 메모리 관리에 신경쓸 필요가 없고 ARC가 알아서 더이상 사용하지 않는 인스턴스를 메모리에서 해지합니다. 하지만 몇몇의 경우 ARC에서 메모리 관리를 위해 코드의 특정 부분에 대한 관계에 대한 정보를 필요로 합니다. 참조 횟수는 클래스 타입의 인스턴스에만 적용되고 값 타입인 구조체 열거형 등에는 적용되지 않습니다. ARC의 동작 (How ARC Works) 클래스의 새 인스턴스를 만들 때마자 ARC는 인스턴스 정보를 담는데 필요한 적정한 크기의 메모리를 할당합니다. 이 메모리는 그 인스턴스에 대한 정보와 관련된 저장 프.. 더보기
Swift Language - 21 - 제네릭 (Generics) 제네릭이 풀려고 하는 문제 (The Problem That Generics Solve) /* 아래와 같이 두 Int 값을 바꾸는 함수가 있습니다. 인자로 넣는 두개의 파라미터는 inout 파라미터입니다. 그래서 두 값의 원본을 변경하게 됩니다. */ func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } // 선언한 함수 swapTwoInts를 선언하면 입력한 두 Int값이 변경된 것을 확인할 수 있습니다. var someInt = 3 var anotherInt = 107 swapTwoInts(&someInt, &anotherInt) print("someInt is now \(someInt), .. 더보기
Swift Language - 20 - 프로토콜 (Protocols) 프로토콜 문법 (Protocol Syntax) // 프로토콜의 정의는 클래스, 구조체, 열거형 등과 유사합니다. protocol SomeProtocol { // protocol definition goes here } // 프로토콜을 따르는 타입을 정의하기 위해서는 타입 이름 뒤에 콜론(:)을 붙이고 따를(Conforming) 프로토콜 이름을 적습니다. 만약 따르는 프로토콜이 여러개라면 콤마(,)로 구분해 줍니다. struct SomeStructure: FirstProtocol, AnotherProtocol { // structure definition goes here } // 서브클래싱인 경우 수퍼클래스를 프로토콜 앞에 적어 줍니다. class SomeClass: SomeSuperclass, Firs.. 더보기
Swift Language - 19 - 익스텐션 (Extensions) 익스텐션을 이용해 클래스, 구조체, 열거형 혹은 프로토콜 타입에 기능을 추가할 수 있습니다. Swift에서 익스텐션을 이용해 다음을 할 수 있습니다. 계산된 인스턴스 프로퍼티와 계산된 타입 프로퍼티의 추가 인스턴스 메소드와 타입 메소드의 추가 새로운 이니셜라이저 제공 서브스크립트 정의 중첩 타입의 선언과 사용 특정 프로토콜을 따르는 타입 만들기 익스텐션 문법 (Extension Syntax) // 익스텐션은 extension 키워드를 사용해 선언합니다. extension SomeType { // new functionality to add to SomeType goes here } // 하나의 익스텐션에서 현재 존재하는 타입에 한개 이상의 프로토콜을 따르도록 확장할 수 있습니다. extension Som.. 더보기
Swift Language - 18 - 중첩 타입 (Nested Types) 중첩 타입의 사용 /* 다음 코드는 블랙잭 게임에서 사용되는 카드를 모델링한 BlackjackCard라는 구조체를 정의한 (예)입니다. BlackjackCard 구조체는 Suit과 Rank라고 부르는 두개의 중첩 열거 타입을 포함 합니다. */ struct BlackjackCard { // nested Suit enumeration // struct 안에 enum이 들어갈 수 있습니다. enum Suit: Character { case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣" } // nested Rank enumeration enum Rank: Int { case two = 2, three, four, five, six, seven, eight.. 더보기
Swift Language - 17 - 타입캐스팅 (Type Casting) 타입캐스팅을 위한 클래스 계층구조 선언 (Defining a Class Hierarchy for Type Casting) // 타입캐스팅의 동작을 확인하기 위해 클래스를 하나 만들어 보겠습니다. class MediaItem { var name: String init(name: String) { self.name = name } } // MediaItem이라는 클래스를 선언했는데 이 클래스를 서브클래싱 해서 두개의 다른 서브클래스를 만들어 보겠습니다. class Movie: MediaItem { var director: String init(name: String, director: String) { self.director = director super.init(name: name) } } class S.. 더보기
Swift Language - 16 - 에러 처리 (Error Handling) 프로그램 실행시 에러가 발생하면 그 상황에 대해 적절한 처리가 필요합니다. 이 과정을 에러 처리라고 부릅니다. 에러의 표시와 발생(Representing and Throwing Errors) // Swift에서 에러는 Error 프로토콜을 따르는 타입의 값으로 표현됩니다. enum VendingMachineError: Error { case invalidSelection case insufficientFunds(coinsNeeded: Int) case outOfStock } /* 에러를 발생시킴으로써 무언가 기대하지 않았던 동작이 발생했고 작업을 계속 수행할 수 없다는 것을 알려줄 수 있습니다. 에러를 발생시키기 위해 throw 구문을 사용할 수 있습니다. 예를들어, 다음 코드는 판매 기기에서 5개의 코.. 더보기
Swift Language - 15 - 옵셔널 체이닝 (Optional Chaining) 옵셔널 체이닝은 nil일 수도 있는 프로퍼티나, 메소드 그리고 서브스크립트에 질의(query)를하는 과정을 말합니다. 만약 옵셔널이 프로퍼티나 메소드 혹은 서브스크립트에 대한 값을 갖고 있다면 그 값을 반환하고 만약 값이 nil이면 nil을 반환 합니다. 여러 질의를 연결해서 할 수도 있는데, 연결된 질의에서 어느 하나라도 nil이면 전체 결과는 nil이 됩니다. 강제 언래핑의 대체로써의 옵셔널 체이닝 (Optional Chaining as an Alternative to Forced Unwrapping) // 다음 코드는 옵셔널 체이닝이 강제 언래핑과 어떻게 다른지 설명해 줍니다. class Person { var residence: Residence? } class Residence { var num.. 더보기
Swift Language - 14 - 초기화 해지 (Deinitialization) 디이니셜라이저는 초기자(Initializer)와 반대로 클래스 인스턴스가 소멸되기 직전에 호출됩니다. 초기자는 선언 키워드로 init를 사용하는데 디이니셜라이저는 선언을 위해 deinit키워드를 사용합니다. 디이니셜라이저는 오직 클래스 타입에서만 사용 가능합니다. 초기화 해지의 동작 (How Deinitilization Works) /* 일반적으로 Swift가 자원의 해제를 자동으로 알아서 해주는데, 열었던 파일을 사용이 끝나고 닫는 것 같이 사용자가 자원 해지를 위해 수동으로 작업 해야하는 경우도 있습니다. 이럴 때 사용하는 것이 디이니셜라이저입니다.디이니셜라이저는 클래스당 오직 하나만 선언할 수 있고 파라미터를 받을 수 없습니다. 디이니셜라이저의 기본적인 선언 형태는 다음과 같습니다. */ deini.. 더보기
Swift Language - 13 - 초기화 (Initialization) 초기화는 클래스, 구조체, 열거형 인스턴스를 사용하기 위해 준비 작업을 하는 단계 입니다. 이 단계에서 각 저장 프로퍼티의 초기 값을 설정합니다. 초기화 과정은 initializer를 정의 하는 것으로 구현할 수 있습니다. 이니셜라이저 (Initializers) // 가장 간단한 형태는 파라미터가 없고 init 키워드를 사용하는 것입니다. init() { // perform some initialization here } // 화씨 온도 구조체를 만들어 온도라는 프로퍼티를 선언하고 이니셜라이저에서 초기화하는 코드입니다. struct Fahrenheit { var temperature: Double init() { temperature = 32.0 } } var f = Fahrenheit() print(".. 더보기
Swift Language - 12 - 상속 (Inheritance) 기반 클래스 정의 (Defining a Base Class) // 다른 어떤 클래스로부터도 상속받지 않은 클래스를 기반 클래스라 합니다. // 예제를 통해 실제 사용에 대해 알아 보겠습니다. class Vehicle { var currentSpeed = 0.0 var description: String { return "traveling at \(currentSpeed) miles per hour" } func makeNoise() { // do nothing - an arbitrary vehicle doesn't necessarily make a noise } } print("Vehicle: \(someVehicle.description)") // Vehicle: traveling at 0.0 mile.. 더보기
Swift Language - 11 - 서브스크립트 (Subscripts) 서브스크립트 문법 (Subscript Syntax) // 서브스크립트 선언 문법은 인스턴스 메소드와 계산된 프로퍼티를 선언하는 것과 비슷합니다. subscript(index: Int) -> Int { get { // 적절한 반환 값 } set(newValue) { // 적절한 set 액션 } } // * 다음은 읽기 전용으로 선언한 서브스크립트의 (예)입니다. [ ]를 쓴다 struct TimesTable { let multiplier: Int subscript(index: Int) -> Int { return multiplier * index } } let threeTimesTable = TimesTable(multiplier: 3) print("six times three is \(threeTimes.. 더보기
Swift Language - 10 - 메소드 (Methods) 인스턴스 메소드 (Instance Methods) class Counter { var count = 0 func increment() { count += 1 } func increment(by amount: Int) { count += amount } func reset() { count = 0 } } // 다음은 이 클래스를 사용한 (예)입니다. let counter = Counter() // 초기 count 값은 0입니다. counter.increment() // count 값이 1로 변경 됐습니다. counter.increment(by: 5) // count 값은 현재 6입니다. counter.reset() // count 값은 0이 됩니다. self 프로퍼티 (The self Property) /.. 더보기
Swift Language - 9 - 프로퍼티 (Properties) 프로퍼티는 클래스, 구조체, 열거형과 관련한 값입니다. 프로퍼티의 종류에는 저장 프로퍼티(Stored Properties)와 계산된 프로퍼티(Computed Properties)가 있습니다. 계산된 프로퍼티는 클래스, 구조체, 열거형 모두에서 사용가능하지만, 저장 프로퍼티는 클래스와 구조체에서만 사용 가능합니다. 저장 프로퍼티 (Stored Properties) // 저장 프로퍼티는 위에서 설명한 대로 단순히 값을 저장하고 있는 프로퍼티 입니다. // 이 프로퍼티는 let키워드를 이용해서 상수 혹은 var키워드를 이용해서 변수로 선언해 사용할 수 있습니다. // 아래예제를 보면 firstValue와 length 에 첫 값과 그 길이를 각각의 프로퍼티에 저장해 범위 값을 표현합니다. struct Fixed.. 더보기
Swift Language - 8 - 클래스와 구조체 (Classes and Structures) 클래스와 구조체의 비교 (Comparing Classes and Structures) 클래스 구조체 공통점 1. 값을 저장하기 위한 프로퍼티 정의 2. 기능을 제공하기 위한 메소드 정의 3. subscript 문법을 이용해 특정 값을 접근할 수 있는 subscript 정의 4. 초기 상태를 설정할 수 있는 initializer 정의 5. 기본 구현에서 기능 확장 6. 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 순응(conform) 차이점 1. 상속 (Inheritance) : 클래스의 여러 속성을 다른 클래스에 물려 줌 2. 타입 캐스팅 (Type casting) : 런타임에 클래스 인스턴스의 타입을 확인 3. 소멸자 (Deinitializers) : 할당된 자원을 해제(free up) 시킴 4... 더보기
Swift Language - 7 - 열거형 (Enumerations) 열거형 문법 (Enumeration Syntax) // enum키워드를 사용해 열거형을 정의합니다. enum SomeEnumeration { // enumeration definition goes here } // 다음은 네 가지 방향을 갖는 CompassPoint 열거형 선언의 (예)입니다. enum CompassPoint { case north case south case east case west } // 여러 case를 콤마(,)로 구분해서 한줄에 적을 수 있습니다. enum Planet { case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune } // 각 열거형 정의는 완전 새로운 타입을 정의합니다. var directionToH.. 더보기
Swift Language - 6 - 클로저 (Closures) 클로저는 어떤 상수나 변수의 참조를 캡쳐(capture)해 저장할 수 있습니다. 클로저는 다음 세 가지 형태 중 하나를 갖습니다. 전역 함수 : 이름이 있고 어떤 값도 캡쳐하지 않는 클로저 중첩 함수 : 이름이 있고 관련한 함수로 부터 값을 캡쳐 할 수 있는 클로저 클로저 표현 : 경량화 된 문법으로 쓰여지고 관련된 문맥(context)으로부터 값을 캡쳐할 수 있는 이름이 없는 클로저 Swift에서 클로저 표현은 최적화 되어서 간결하고 명확합니다. 이 최적화에는 다음과 같은 내용을 포함합니다. 문맥(context)에서 인자 타입(parameter type)과 반환 타입(return type)의 추론 단일 표현 클로저에서의 암시적 반환 축약된 인자 이름 후위 클로저 문법 클로저 표현 (Closure Exp.. 더보기
Swift Language - 5 - 함수 (Functions) 정의와 호출 (Defining and Calling Functions) // 함수를 선언할 때는 가장 앞에 func 키워드를 붙이고 (person: String) 파라미터와 형 그리고 -> String 형태로 반환형을 정의합니다. func greet(person: String) -> String { let greeting = "Hello, " + person + "!" return greeting } // 정의한 함수에 인자 값을 넣어 호출한 (예) print(greet(person: "Anna")) // Prints "Hello, Anna!" print(greet(person: "Brian")) // Prints "Hello, Brian!" // 위 함수에서 메시지를 결합하는 부분과 반환하는 부분을 합.. 더보기
Swift Language - 4 - 제어문 (Control Flow) Swift에서는 while loop, if guard, switch, for-in 문 등 많은 제어문을 제공합니다. For-In 문 (For-In Loops) // for-in문는 배열, 숫자, 문자열을 순서대로 순회(iterate)하기 위해 사용합니다. let names = ["Anna", "Alex", "Brian", "Jack"] for name in names { print("Hello, \(name)!") } // Hello, Anna! // Hello, Alex! // Hello, Brian! // Hello, Jack! // 사전(dictionary)에서 반환된 키(key)-값(value) 쌍으로 구성된 튜플을 순회하며 제어할 수도 있습니다. let numberOfLegs = ["spider.. 더보기
Swift Language - 3 - 콜렉션 타입 (Collection Types) Swift에서는 콜렉션 타입으로 Array, Set, Dictionary 세 가지를 지원합니다. 배열(Array) // 배열 타입은 Array로 적을 수 있는데 축약형으로 [Element] 형태로 사용할 수도 있습니다. // Int형 빈 배열을 생성할 수 있습니다. var someInts = [Int]() print("someInts is of type [Int] with \(someInts.count) items.") // someInts is of type [Int] with 0 items. someInts.append(3) // 배열에 3을 추가 했습니다. someInts = [] // 배열을 비웠습니다. 배열의 아이템 타입은 그대로 Int로 유지됩니다. 기본 값으로 빈 배열 생성 // repeat.. 더보기
Swift Language - 2 - 문자열과 문자 (Strings and Characters) 문자열 리터럴 (Strings) // 문자열은 큰 따옴표(“)로 묶어 표현 합니다. let something = "Some string literal value" // 여러줄 문자열을 사용할 때는 첫 시작의 """ 다음 줄부터 마지막 """의 직전까지를 문자열로 봅니다. let quotation = """ The White Rabbit put on his spectacles. "Where shall I begin, please your Majesty?" he asked. "Begin at the beginning," the King said gravely, "and go on till you come to the end; then stop." """ 빈 문자열 초기화 var emtpryString = ".. 더보기
Swift Language - 1 - 기본 연산자 (Basic Operators) 할당 연산자(Assignment Operator) let b = 10 var a = 5 a = b // a 값은 10 let (x, y) = (1, 2) // x 는 1, y 값은 2 가 됩니다. 사칙 연산자(Arithmetic Operators) 1 + 2 // 3 5 - 3 // 2 2 * 3 // 6 10.0 / 2.5 // 4.0 나머지 연산자(Remainder Operator) 9 % 4 // 1 -9 % 4 // -1 단항 음수 연산자(Unary Minus Operator) let three = 3 let minusThree = -three // minusThree는 -3 let plusThree = -minusThree // plusThree는 3, 혹은 "minus minus 3" 단항 양.. 더보기