Swift
[Swift] 스위프트 네이티브 객체
Sky Titan
2021. 6. 15. 21:13
728x90
Cocoa Internals
코코아 프레임워크의 멀티 패러다임을 파헤쳐보자애플이 코코아 프레임워크를 블랙박스로 만들어놓아 직접 들여다볼 수 없다. 하지만 컴파일러 옵션을 활용해서 컴파일 결과 파일을 분석하거
www.yes24.com
스위프트 네이티브 객체
- 스위프트의 클래스 타입은 objective-c와 호환성을 유지하는 객체, 호환 되지 않는 네이티브 객체로 사용할 수 있다.
- Pen이라는 네이티브 클래스가 있다고 가정
- 해당 객체에 대해서 swift 컴파일러가 생성한 swift 중간 언어 (SIL)에 생성 함수와 소멸 함수가 만들어짐
- 이름 변형 : 컴파일 과정에서 init(), deinit()을 프로그램 내부에서 고유하게 구분하기 위해 이름을 바꿈
- 컴파일러는 원래의 함수 이름을 주석으로 표시해줌 EX) //class.Pen.init
- objective-c는 -init과 +alloc 함수가 나뉘어져 있지만 swift 네이티브 객체는 allocating_init() 함수 내부에서 alooc_ref(), init() 메서드를 호출해서 메모리 할당 및 객체 인스턴스 내부 프로퍼티 초기화를 진행한다.
- 변수들에 대해 getter/setter 함수 생성
- //class.Pen.id.getter : Swift.Int
- //class.Pen.time.getter : Swift.Int
- //class.Pen.time.setter : Swift.Int
- //class.Pen.time.materializeForSet : Swift.Int0 : computed Property나 lazy var처럼 선언한 변수에 대한 초기 값을 바로 할당하지 않는 경우, null값에 대한 optional 처리를 하여 안전하게 값을 설정할 때 사용한다.
- let으로 선언한 id는 setter 함수가 없다.
import Foundation
class Pen {
let id = 101010
var time = 1023
}
스위프트 오브젝티브-C 호환 객체
- 오브젝티브-C 객체와 호한성을 주기 위해서 NSObject 상속 받기
- //@objc class.Pen.init() -> Pen
- 스위프트 네이티브 객체와 다른 점
- deinit()에 해당하는 소멸함수가 없다.
- @objc가 붙은 호환성 함수가 생긴다. -> 내부 함수 init()을 호출해주는 역할
import Foundation
class Pen: NSObject {
let id = 101010
var time = 1023
}
스위프트 중간 언어 (SIL)
- swift 컴파일러(swiftc)는 swift로 작성한 코드 파일을 읽어서 SIL로 만들고 LLVM IR로 변환한다.
- LLVM IR 최적화기를 거쳐서 최종적으로 Target Machine에 맞는 기계코드(MC)를 생성한다.

728x90