1. Static Dispatch를 사용하자 class뿐만 아니라 상속, 오버라이딩 될 필요가 없는 클래스, 메서드, 프로퍼티에 final 키워드를 붙여 Static Dispatch를 통해 성능 향상을 기대할 수 있다.( 저장 프로퍼티의 경우 오버라이딩이 원래 불가하니 의미가 없을 듯 ) Static Dispatch란? 호출할 메서드를 컴파일 타임에 결정하겠다! 런타임때 호출할 메서드를 이미 결정해 놨으니 성능이 좋다! Dynamic Dispatch란? 호출할 메서드를 런타임에 결정하겠다! Swift는 Dynamic Dispatch를 지원하기 위해 클래스마다 함수 포인터들의 배열인 vTable(Virtual Method Table)을 갖고 있다. 하위 클래스가 상위의 메서드를 호출할때 vTable을 런타..
Class 참조 타입(call by reference)이다 -> 힙 영역에 생성된다 ( 주의 : 힙 영역에 참조타입만 적재되지는 않음 ) 상속(단일)이 가능하다 -> 다형성 구현에 용이하다 iOS 프레임워크의 대부분은 Class로 구현되어 있다 ( ex. UIViewController ) Swift에서는 class의 인스턴스만 Object 부르며 Object는 ARC가 메모리 관리를 해준다 Struct 값 타입이다(call by value) -> 스택 영역에 생성된다 상속이 불가능하다 Swift의 뼈대들은 대부분 Struct로 구현되어 있다 ( ex. Int, Double, String ) 멀티스레딩에 안전하다 Object가 아니기 때문에 AnyObject로 캐스팅할 수 없다 Enum 공식 문서 정의 :..
func addTwoNumbers(num1: Int, num2: Int) -> Int { var result = num1 + num2 return result } 위와 같은 구조를 가진 함수의 동작 방식을 메모리 영역을 기준으로 간단하게 살펴보면 다음과 같은 순서를 가진다. 1. 임시공간을 만든다 2. num1라는 상수에 Int값을 저장한다 3. num2라는 상수에 Int값을 저장한다 4. result 변수 공간을 만든다 5. num1 + num2를 더해 임시값을 가진다 6. 임시값을 result에 할당한다 7. result의 값을 임시공간에 저장한다 8. 임시 공간의 값을 함수의 결과로 리턴시켜준다 이때 굳이 result라는 변수에 임시값을 할당하고 다시 리턴시켜줄 필요 없이 바로 임시값을 리턴시켜주면..
NSManagedObjectModel 앱에서 사용하는 data model, data model이 가질 수 있는 properties, data model 사이의 relationships을 나타내며 RDB에서의 database schema라고 생각할 수 있다. *NSManagedObjectModel 과 data model editor의 관계? 1. editor로 xcdatamodel 파일을 만들고 편집한다. 2. momc(컴파일러)가 model 파일들을 담고 있는 momd폴더로 컴파일해준다. 3. CoreData가 momc에 의해 컴파일된 momd 폴더를 사용해 런타임때 NSManagedObjectModel를 초기화한다 NSPersistentStore storage method를 사용하여 데이터를 읽거나 쓴..
swift는 함수형 프로그래밍 패러다임을 차용했다. 함수형 프로그래밍의 가장 큰 특징은 함수를 일급 객체(first-class object)로 다룬다는 점이다 자바스크립트를 공부하면서도 나왔었던 개념이라 익숙하지만 그래도 정확히 알지는 못하기에 정리해봤다 정의 일급 객체란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다. 출처. 위키백과 일급 객체가 되기 위한 조건 전달 인자로 전달할 수 있다 동적 프로퍼티 할당이 가능하다 변수나 데이터 구조 안에 담을 수 있다 반환 값으로 사용할 수 있다 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별할 수 있다
옵셔널 정의 A type that represents either a wrapped value or nil, the absence of a value. 래핑 된 값 또는 값이 없는 nil을 나타내는 타입입니다. 왜 옵셔널 타입을 사용해야 하나 옵셔널로 선언된 변수는 초기화가 수행되지 않으면 nil로 자동 초기화 되기 때문에 런타임 에러를 방지할 수 있기 때문이다. 옵셔널 구조 enum Optional { case none // nil case some(Wrapped) // optional value } var name: String? // var name: Optional = .none var name: String? = "Terry" // var name: Optional = some("Terry") ..
enum MainDish{ case pasta(taste: String) case pizza(dough: String, topping: String) case chicken(withSauce: Bool) case rice } var breakfast: MainDish = .pizza(dough: "thin", topping: "meat") 튜플 안에서 let키워드 사용 사용하려는 모든 연관값에 let키워드를 붙여줘야 함 if case .pizza(let dough, let topping) = breakfast{ print("Yes! \(dough) and \(topping)") } // Yes! thin and meat 사용하려먼 연관값에 let키워드를 안붙여줬을때 에러 발생 if case .pizza(..
용어 정리 저장 프로퍼티 : 인스턴스의 변수 또는 상수 ( 클래스 , 구조체 ) 연산 프로퍼티(get, set) : 값을 저장한 것이 아니라 특정 연산을 실행한 결괏값 ( 클래스, 구조체, 열거형 ) 타입 프로퍼티 : 클래스 변수 프로퍼티 감시자 : 프로퍼티의 값이 변할 때 값의 변화에 따른 특정 작업을 수행함 저장 프로퍼티 구조체는 기본적으로 저장 프로퍼티를 매개변수로 갖는 이니셜라이저가 있음 클래스는 저장 프로퍼티의 초깃값을 지정해주지 않으면 사용자 정의 이니셜라이저를 정의해줘야 함 struct CoordinatePoint{ var x: Int // 초깃값을 지정해 줄 수도 있음 var y: Int } var myPoint: CoordinatePoint = CoordinatePoint(x: 10, y..
enum을 사용하는 이유 enum은 배열이나 딕셔너리와 다르게 정의해준 항목 값 외에는 추가/수정이 불가하기 때문에 다음과 같은 경우 사용 가능 제한된 선택지를 주고 싶을 때 정해진 값 외에는 입력받고 싶지 않을 때 예상된 입력 값이 한정되어 있을 때 기본 enum 선언 enum School{ case primary case elementary case middle } enum School{ case primary, elementary, middle } 원시 값을 가지는 enum enum School: String{ case primay = "유치원" case elementary = "초등학교" } enum School: String{ case primary = "유치원", elementary = "초등..