Swift 5.9에서는 복사 불가능한 타입(Noncopyable Types)이 새롭게 도입되었습니다. 이 기능을 통해 특정 구조체(struct)나 열거형(enum)을 복사할 수 없도록 만들어, 고유한 소유권을 명확히 관리할 수 있습니다.
왜 도입됐을까?
기존 Swift의 값 타입(struct, enum)은 항상 복사가 가능했습니다. 즉, 같은 데이터를 여러 번 복사하여 사용할 수 있었죠. 이는 편리하지만 때론 부적합합니다. 예를 들어, 파일 핸들이나 네트워크 소켓 같은 리소스는 하나의 고유한 소유권만을 요구하며, 복사가 가능하면 리소스 관리가 어려워지기 때문입니다.
이 문제를 해결하기 위해 Swift 5.9부터는 복사를 금지하는 기능을 제공합니다.
어떻게 사용하나?
복사 불가능한 타입을 정의할 때는 타입 선언 뒤에 : ~Copyable을 붙입니다.
struct FileDescriptor: ~Copyable {
private var fd: Int32
init(fd: Int32) {
self.fd = fd
}
consuming func close() {
close(fd)
discard self
}
deinit {
close(fd)
}
}
핵심 개념
- 고유 소유권(Unique Ownership)
- Noncopyable 타입은 항상 하나의 인스턴스가 정확히 하나의 소유자를 가집니다. 여러 곳에서 동시에 복사해 사용할 수 없습니다.
- 소비(consuming)
- consuming 키워드는 메서드에서 호출 시 해당 인스턴스를 소비하여 무효화함을 나타냅니다. 즉, 사용 후 더 이상 쓸 수 없게 됩니다.
- 초기화 해제자(deinit)
- 클래스와 마찬가지로 복사 불가능 타입도 deinit을 가질 수 있으며, 인스턴스가 사라질 때 자동으로 호출됩니다.
예시로 이해하기
var file = FileDescriptor(fd: open("/tmp/file.txt", O_RDONLY))
// 파일 사용 후
file.close() // 명시적으로 닫음
여기서 file을 복사하려 하면 컴파일러 오류가 발생합니다.
let copyFile = file // ❌ 오류! 복사 불가능
사용 시 유의사항
- 복사 불가능 타입은 Array, Optional과 같은 제네릭 타입에 사용할 수 없습니다.
- 클래스 내부에 복사 불가능 타입의 저장 속성을 가질 수 있지만, 클래스 자체는 여전히 복사 가능한 참조입니다.
결론
Noncopyable 타입은 리소스 관리의 안전성과 명확성을 높여줍니다. 이를 통해 파일이나 네트워크 연결 같은 민감한 자원을 더 효율적이고 안전하게 다룰 수 있게 되었습니다.
더 자세한 정보
swift-evolution/proposals/0390-noncopyable-structs-and-enums.md at main · swiftlang/swift-evolution
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - swiftlang/swift-evolution
github.com
'iOS > Swift' 카테고리의 다른 글
[ Swift ] Codable vs Decodable vs Encodable: 언제, 왜, 어떻게 쓸까? (0) | 2025.04.04 |
---|---|
[ Swift ] 비동기 처리와 DispatchQueue.main.async (0) | 2025.04.04 |
[ Swift ] ARC : Automatic Reference Counting (0) | 2025.03.25 |
[ Swift ] 접근 제어자 (0) | 2025.03.13 |
[ Swift ] 중첩 타입 (0) | 2025.03.13 |