swift
-
swift - Memory Basicsswift 2021. 1. 13. 09:36
1Byte : -128 ~ 127 , 0 ~ 256 Data Bit : 실제 값을 저장하는 비트 0이면 양수 1이면 음수 운영체제는 프로그램이 시작되면 메모리공간을 할당하는데 사용 용도에 따라 다음과 같이 구분한다. Code : 기계어로 번역된 프로그램 코드가 저장 Data : 정적변수와 전역변수가 저장된다. 프로그램이 시작되면 생성되었다가 프로그램이 종료되면 제거 Stack : 지역변수, 파라미터와 리턴 값 등이 저장된다. 스텍은 함수 호출과 관련이 있는데 함수가 호출되면 함수에서 사용하는 모든 값을 저장하는 메모리 공간이 자동으로 생성된다. 이걸 stack frame이라고 한다. 함수의 실행이 종료되면 stack에서 자동으로 제거되고 다른 함수에서 메모리를 다시 사용할 수 있게 된다. Heap : 동..
-
swift - Protocols #9 (Protocol Extension)swift 2021. 1. 12. 19:27
Protocol Extension Extension은 형식을 확장한다 Protocol 또한 형식이기 때문에 extension을 통해 확장 가능 extension으로 프로토콜을 확장하면 프로토콜을 채용한 모든 형식에 기본 구현을 제공할 수 있다. 프로토콜에는 선언만 포함된다고 공부햇는데 extension을 통해 구현을 추가한다는 것이 조금 어색할 수 있지만 문법적으로는 protocol에 구현을 추가하지만 실제로는 프로토콜을 채용한 형식에 구현이 추가된다. 코드 중복을 줄이면서 프로토콜 요구사항을 충족시킬수 있다는 장점이 있다. protocol Figure { var name: String { get } func draw() } // 여기에서 Self는 프로토콜을 채용한 형식을 나타낸다 -> 형식이 Equa..
-
swift - Protocols #8 (Optional Protocol Requiredments)swift 2021. 1. 12. 19:17
// 선택적 요구사항 // Optional 이라는 용어 -> optional 형식을 의미하는 것이 아니라 단어 그대로 선택적이라는 의미로 사용한다. // 이걸 Optinal로 바꾸면 //protocol Drawable { // var strokeWidth: Double { get set } // var strokeColor: UIColor { get set } // func draw() // func reset() //} // 이런 프로토콜은 class 전용이다 -> struct이나 enum에서는 불가능 // 이전에 AnyObject로 선언하면 class전용이 된다고 말했는데 @objc optional을 하면 AnyObject가 자동으로 채용된다. @objc protocol Drawable { @objc..
-
swift - Protocols #7 (Protocol Composition)swift 2021. 1. 12. 19:09
protocol Resettable { func reset() } protocol Printable { func printValue() } class Size: Resettable, Printable { var width = 0.0 var height = 0.0 func reset() { width = 0.0 height = 0.0 } func printValue() { print(width, height) } } class Circle: Resettable { var radius = 0.0 func reset() { radius = 0.0 } } class Oval: Circle { } let r: Resettable = Size() let p: Printable = Size() var rp: Rese..
-
swift - Protocols #6 (Protocol Types, protocol Conformance, Collection of protocol Types)swift 2021. 1. 12. 19:02
Protocol Types 프로토콜은 First-class Citizen이다. 다시 말해서 독립적인 형식 변수와 상수를 선언할때 자료형으로 사용하거나 파라미터의 자료형, 리턴형의 자료형으로 사용하는 것도 가능함 protocol Resettable { func reset() } class Size: Resettable { var width = 0.0 var height = 0.0 func reset() { width = 0.0 height = 0.0 } } let s = Size() // upcating과 유사 // 프로토콜로 저장하면 프로토콜에 저장된 멤버만 사용 가능 let r: Resettable = Size() // r.width err // r.height err r.reset() // 호출가능 ..
-
swift - Protocols #4 (Initializer Requiredments)swift 2021. 1. 12. 18:42
// 프로토콜에서 생성자를 선언하고 형식에서 요구사항을 만족해보자 // {} , body 생략 // failable로 선언하는 것도 가능 protocol Figure { var name: String { get } init(n: String) } struct Rectangle: Figure { // 구조체에는 속성만 선언되어 있는데 지금도 요구사항을 만족하고 있다. // 왜냐? 기본적으로 생성되는 init이 프로토콜에 선언된 init과 동일하기 때문에 // 프로토콜에 있는 생성자 파라미터의 이름을 바꾸면 직접 구현해야함 var name: String init(n: String) { name = n } } class Circle: Figure { var name: String // class에서는 상속을 ..
-
swift - Protocols #3 (Method Requirements)swift 2021. 1. 12. 18:20
// 프로토콜에서 메소드를 선언하고 형식에서 메소드 요구사항을 구현 // {}와 method body는 선언하지 않음 // 프로토콜을 값 형식이 채용할 수 있고 메소드 내부에서 속성값을 변경해야 한다면 mutating 키워드를 추가해야 한다. // 이 경우 값 형식 전용이라고 생각할수도있지만 프로토콜에서의 mutating은 메소드에서 속성을 변경할 수 있어야 한다는 요구사항을 표현할 뿐 -> 참조형식에서도 문제없이 채용 할 수 있음 protocol ResetTable { mutating func reset() static func reset2() } class Size: ResetTable { var width = 0.0 var height = 0.0 // 여기서는 mutating 키워드를 붙이지 않아도..