SWIFT
[Swift]. self vs Self
self 클래스/구조체 내에서 해당 인스턴스(자기자신)을 가르킴 프로토콜에서의 Self사용(프로토콜을 채택하는 해당 타입을 가르킴) 프로토콜 내에서 Self를 선언하면 채택한 타입을 의미한다. //BinaryInteger이란 프로토콜의 확장 extension BinaryInteger{ func squared() -> Self{ //BinaryInteger이란 프로토콜을 채택한 해당타입(Int, UInt등등..) return self * self } } // 위의 Self를 Int나 UInt로 적는다면 BinaryInteger을 채택한 모든 타입을 확장해줘야한다 아래처럼 /* extension BinaryInteger { func squared() -> Int { return self * self } } ..
[Swift]. Method Dispatch
Method Dispatch 실제로 Method는 CPU에대한 명령어이며, 실제론 코드 영역에만 존재한다. 그렇기 때문에 코드 영역에 있는 메서드를 실행시키려면 메서드 주소가 필요하다. 그런데 그 메서드 주소를 기억하고, 어떤 메서드를 실행시킬지에 관련된 내용이다. 한 마디로 "어떤 메서드를 부를지 선택하는것" Swift가 함수(메서드)를 실행시키는 방법은 3가지가 있다. 컴파일타임/런타임 컴파일타임: 작성된 소스코드는 컴파일이라는 과정을 통해 기계어 코드로 변환되어 실행 가능한 프로그램이 된다. 이러한 편집 과정을 컴파일타임(Compiletime)이라고 부른다. 런타임: 컴파일과정을 마친 프로그램이 사용자에 의해 실행되며, 이러한 프로그램이 동작되는 때를 런타임(Runtime)이라 부른다 @컴파일타임 ..
[Swift]. 프로토콜지향 프로그래밍(POP)
프로토콜 지향 프로그래밍(Protocol - Oriented - Programming) 객체지향 프로그래밍 장점 - 상속을 이용한 코드의 재사용성 단점 - 하나의 클래스만 상속이 가능하다.(다중 상속 불가능) - 상위클래스의 메모리 구조를 따라갈 수 밖에 없음.(필요하지 않은 속성/메서드도 상속된다.) - 클래스(참조타입)에서만 사용 가능 프로토콜 지향 프로그래밍 스위프트의 표준 라이브러리의 타입과 관련된 것을 살펴보면 대부분 구조체로 구현이 되어있다. 객체지향 프로그래밍 패러다임에 기반을 둔 언어는 대부분 클래스의 상속을 사용해 타입에 공통된 기능을 구현한다. 상속도 되지 않는 구조체로 다양한 공통 기능을 가질수 있는가.. 이는 프로토콜과 익스텐션으로 이루어져있다. 프로토콜은 특정 역할을 수행하기 위한..
[Swift]. 속성 감시자(Property Observer)
속성 감시자(Property Observer) 저장속성을 관찰하는 역할 class Profile { // 일반 저장 속성 var name: String = "이름" // 저장속성 + 저장 속성이 변하는 시점을 관찰하는 메서드 var statusMessage: String = "기본 상태메세지" { //저장속성 willSet(message) { //속성감시자, 바꿀 값이 파라미터로 전달 print("메세지가 \(statusMessage)에서 \(message)로 변경될 예정입니다.") print("상태메세지 업데이트 준비") } didSet(message){ //속성감시자, 바뀌기 전의 값이 파라미터로 전달 print("메세지가 \(message)에서 \(statusMessage)로 변경되었습니다") pr..
클래스(class) vs 구조체(struct), 객체지향프로그래밍 feat. Swift
클래스 클래스는 참조타입(RefrenceType)이다. 힙의 영역에 실제 데이터를 저장하고 스택영역에선 힙영역의 주소를 가리킨다. 그래서 주소를 참조하는 참조타입이다. 복사시 값을 복사하는게 아니라 주소를 전달해서 동일한 데이터를 가리키게 만든다. (메모리 변경 X) 그러므로 복사된 객체의 값을 바꾸면 원본값도 함께 바뀐다. 힙(Heap)의 공간에 저장하므로, ARC시스템을 통해 메모리를 관리한다. class Person{ var name = "사람" } var p = Person() //p에 담긴값 주소: x123124 var p2 = p //p2에 담긴값 주소: x123124 //p와 p2는 클래스이므로 같은 주소값을 갖는다. p.name //사람 p2.name = "미진" //미진 p.name //..
[Swift] Hashable(Hash/HashValue) 프로토콜
유일한 값을 갖도록 해서 Dictionary의 키값 또는 Set요소가 될 수 있게 하는 프로토콜 두 객체나 인스턴스를 비교하는데 사용되는 프로토콜이다. Hashable프로토콜은 데이터 타입의 값을 해시코드나 해시값으로 변환한다. Equatable 프로토콜을 상속한다. Hashable을 알기 전에.. 딕셔너리의 Key값은 Hashable해야한다. Hash값을 갖는다 라는 뜻이다.. 그게 무엇이냐? Hash함수 어떤 숫자/글 등을 input으로 사용해 어떤 알고리즘을 통해 고정된 길이의 숫자/글자이면서 유일한 값이 나오는 함수 어떤 알고리즘인지는 중요하지 않다. 해쉬값이라는 예는 아래와 같다. 예 ex). "steve", "cooker", "ilon"가 어떤 함수를 거치게 되면 해쉬(Hash)함수⤵️ (ha..
[Swift]. @어트리뷰트 키워드와 다양한 키워드들
어트리뷰트 키워드 컴파일러에게 추가적인 정보를 제공하는 키워드 @available, @objc, @escaping, @IBOutlet, @IBAction, @discardableResult ... 1. 선언에 추가적인 정보를 제공 @available(iOS 11.0, macOS 10.12, *) class MyClass{ //... } //MyClass 선언은 iOS 11.0, macOS 10.12이상에만 적용되는 클래스 //그보다 아래 버전에선 컴파일러가 못읽는다. MyClass의 선언에 대한 추가정보 제공 2. 타입에 추가 정보 제공 func doAnything(completion: @escaping() -> ()){ //... } //@escaping: () -> () 타입에 대한 추가정보 제공 @..
[Swift] 문자, 문자열 처리 함수
기본 / 배열 변환 string.count // 문자열의 개수 Int string.isEmpty // 문자열이 비었는지 true/false string.contains("문자열") // 문자열이 문자열을 포함하는지 true/false string.randomElement() // 문자열중 랜덤을 리턴 string.suffled() // 문자열을 섞어서 Character배열로 리턴 let sArr = string.map{ String($0) } //문자열을 String배열로 리턴 let string = sArr.joined() //String배열을 String으로 변환 let arr = Array(string) // 문자열을 Character배열로 변환 let string = String(arr) // C..
[Swift] Character를 Int로 변환
let char: Character = "5" if let intValue = char.wholeNumberValue{ print(intValue) } else { print("Not an Integer") } 또는 let char: Chracter = "1" if let number = Int(String(char)){ //use number } 속도는 .wholeNumberValue가 더 빠르다고 한다.
[Swift] 프로퍼티(Property) 저장, 지연저장, 연산, 읽기 전용 연산,
프로퍼티(Property) 저장 프로퍼티(Stored Properties) 연산 프로퍼티(Computed Properties) 타입 프로퍼티(Type properties) 저장프로퍼티 저장프로퍼티는 클래스나 구조체에서 변수나 상수를 저장하는 가장 단순한 프로퍼티이다. 기본 형태 struct person1{ let name: String = "jake" //상수 저장 프로퍼티 var age: Int = 20 //변수 저장프로퍼티 } class person2{ let name: String = "jake" var age: Int = 20 //이니셜라이저 지정 // 초기값을 지정하지 않았거나, 지정했더라도 후에 값 변경이 있을 경우 이니셜라이저를 지정해주어야 한다. init(age: Int){ self.age..