Swift 6.0 기능 정리
1. 엄격 동시성 (Strict Concurrency by Default)
예시 1 – Sendable 준수 필수화
struct User: Sendable {
let id: Int
let name: String
}
func updateUser(_ user: User) async {
print(user.name)
}
Swift 6에서는 actor 간 전달되는 모든 타입이 Sendable 여야 합니다.
@unchecked Sendable 을 붙여 임시 우회할 수 있지만 경고로 표시됩니다.
예시 2 – Data Race 감지 (컴파일 타임 오류)
var counter = 0
Task {
counter += 1 // ❌ Swift 6에서는 data race 오류
}
이전 버전에서는 경고였던 항목이 Swift 6 언어 모드에선 컴파일 에러로 승격됩니다.
2. Typed throws (에러 타입 명시)
예시 1 – 지정된 에러 타입
enum NetworkError: Error {
case invalidURL
case timeout
}
func fetchData(from url: String) throws(NetworkError) -> Data {
guard let _ = URL(string: url) else {
throw .invalidURL
}
return Data()
}
do {
let data = try fetchData(from: "bad-url")
} catch let error as NetworkError {
print("Network Error:", error)
}
catch 구문에서 에러 타입이 자동으로 추론됩니다.
예시 2 – Never 타입
func parseNumber(_ text: String) throws(Never) -> Int {
return Int(text)!
}
throws(Never)는 절대 throw 하지 않음을 보장합니다.
3. 매크로 (Macro) 정식 지원
예시 – 커스텀 매크로로 자동 프로퍼티 추가
@attached(member)
macro AddTimestamp() = #externalMacro(module: "CoreMacros", type: "AddTimestampMacro")
@AddTimestamp
struct Message {
let text: String
}
// 컴파일 후 자동 생성:
extension Message {
var createdAt: Date { Date() }
}
매크로는 컴파일 타임에 코드 생성, 검증, 자동화 등을 수행할 수 있는 강력한 기능입니다.
4. 비복사 타입 (Non-copyable / ~Copyable)
struct FileHandle: ~Copyable {
private let descriptor: Int32
deinit {
close(descriptor)
}
}
~Copyable은 값을 복사하지 않고 이동만 허용합니다. 리소스 관리(파일, 락, 버퍼)에 효율적입니다.
5. C++ 상호운용 강화
// C++ 파일
struct Vector3 {
float x, y, z;
float length() const { return sqrt(x*x + y*y + z*z); }
};
// Swift 코드
import CXXVectorLib
let v = Vector3(x: 3, y: 4, z: 0)
print(v.length()) // 5.0
Swift 6은 C++ 함수, 클래스, move-only 타입 호출 및 호환성이 개선되었습니다.
6. 동시성 도우미 API (Atomic / Mutex)
import Synchronization
let counter = ManagedAtomic(0)
Task.detached {
counter.wrappingIncrement(ordering: .relaxed)
}
print(counter.load(ordering: .relaxed))
Synchronization 프레임워크에 포함된 ManagedAtomic, Mutex 등으로 락 없이 안전한 연산이 가능합니다.
7. Swift Testing 프레임워크
import Testing
@Test
func testAddition() {
#expect(1 + 1 == 2)
}
@Test(arguments: [1, 2, 3])
func testIsPositive(_ value: Int) {
#expect(value > 0)
}
Swift 6부터 Swift Testing 패키지가 포함되어 import Testing 만으로 바로 사용 가능합니다.
8. 임베디드 스위프트 (Embedded Swift) 미리보기
@freestanding(expression)
macro printEmbeddedMessage() = #externalMacro(module: "EmbeddedMacros", type: "HelloMacro")
func main() {
#embedded printEmbeddedMessage()
}
임베디드 환경용 런타임이 없는 코드 생성 모드로, 펌웨어나 IoT 기기 개발용으로 사용됩니다.
9. Swift Package Manager 개선
// Package.swift
swiftLanguageVersions: [.v6],
swiftSettings: [
.enableExperimentalFeature("StrictConcurrency")
]
매크로 패키지 배포 지원, 종속성 해석 속도 향상, Swift 플러그인 내 매크로 자동 탐지 기능이 추가되었습니다.
10. 정리 및 마이그레이션 팁
| 항목 | Swift 5 | Swift 6 변경점 |
| 동시성 안전 | 옵션 (경고) | 기본 강제 (오류) |
| throws | 모두 Error | Typed throws 지원 |
| 매크로 | 실험적 | 정식 도입 |
| 비복사 타입 | 없음 | ~Copyable 도입 |
| 테스트 | XCTest | Testing 프레임워크 |
| SPM | 단순 | 매크로/플러그인 통합 |
Swift 6는 언어의 안정성과 생산성 모두 완성 단계에 도달했습니다.
Swift 5.x 코드는 대체로 빌드되지만, Sendable 및 actor 격리 문제를 정리해야 합니다.
새 프로젝트라면 Swift 6 언어 모드 + 엄격 동시성을 기본값으로 설정하는 것을 권장합니다.
'Dev Study > Swift' 카테고리의 다른 글
| Swift에서 contains(where:) vs filter().count > 0 (0) | 2025.11.10 |
|---|---|
| Swift에서 for-in vs 인덱스 기반 반복(0..<array.count) (0) | 2025.11.10 |
| Swift에서 count > 0 대신 isEmpty를 사용하는 이유 (0) | 2025.11.10 |
| Swift 6.1 기능 정리 (0) | 2025.11.10 |
| Swift Throttle vs Debounce 완벽 가이드 (1) | 2025.11.07 |
| Swift class vs final class 비교 (0) | 2025.11.07 |
| Swift에서 소수점 다루기 완전 정리 (round, floor, ceil, format) (0) | 2025.11.06 |
| Swift 문자열 끝에 ‘…’ 붙이기 (문자열 자르기 Extension) (0) | 2025.11.06 |

