관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 1. noncopyable, ~Copyable - 개념 (Swift 5.9+, owner, ownership, 최적화) 본문

iOS 응용 (swift)

[iOS - swift] 1. noncopyable, ~Copyable - 개념 (Swift 5.9+, owner, ownership, 최적화)

jake-kim 2024. 5. 13. 01:38

1. noncopyable, ~Copyable - 개념 (Swift 5.9+, owner, ownership, 최적화)

2. noncopyable, ~Copyable - 연산자 (borrowing, inout, consuming)

noncopyable, ~Copyable 이란?

  • Swift5.9에서 탄생
struct SomeStruct: ~Copyable {
    var name: String
}

enum SomeEnum: ~Copyable {
    case a
}
  • swift5.9 이전 swift 모든 타입들은 모두 copyable 타입
    • noncopyable은 swift5.9에서 enum과 struct에 적용 가능하도록 등장
  • class 타입은 deinit이 있어서 이 deinit을 활용할 수 있지만, struct와 enum은 존재하지 않음
  • 이렇게 deinit되는 타이밍을 알 수 있는 unique resources 관리할 때 struct와 enum을 사용하는 니즈를 위해 ~Copyable이 탄생
  • unique resources 관리 포인트에서의 class와 struct 비교
    • class를 unique resources로 사용할 땐 개체의 참조만 복사되기 때문에 단 하나의 리소스를 위해서 heap영역에 계속 올려놓는것보다 stack 영역에 ~Copyable로 메모리를 관리하는 것이 더욱 효율적
  • ~Copyable을 사용하여 struct, enum을 정의하면 `unique ownership`을 갖는다고 표현

ex) file descriptor와 같은 기능을 만들 때 struct로 선언하고 ~Copyable을 사용하여 deinit시점도 관리하는 코드

struct FileDescriptor: ~Copyable {
  private var fd: Int32

  init(fd: Int32) { self.fd = fd }

  func write(buffer: Data) {
    buffer.withUnsafeBytes { 
      write(fd, $0.baseAddress!, $0.count)
    }
  }

  deinit {
    close(fd)
  }
}

 

* 이 ~Copyable을 함수와 같은 곳에서 주고받을때, 연산자를 사용하지 않으면 컴파일 에러가 발생하는데, 이 내용은 다음 포스팅 글에서 계속..


* 참고
- https://github.com/apple/swift-evolution/blob/main/proposals/0390-noncopyable-structs-and-enums.md

Comments