본문 바로가기
Swift

[Swift] 스위프트 네이티브 객체

by Sky Titan 2021. 6. 15.
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

'Swift' 카테고리의 다른 글

[Swift] Any, AnyObject  (0) 2021.06.21
[Swift] defer  (0) 2021.06.21
[Swift] 가변매개변수 (Variadic Parameters)  (0) 2021.06.13
[Swift] class 키워드 vs static 키워드  (0) 2021.06.02
[Swift] ARC (Auto Reference Counting)  (0) 2021.05.31

댓글