Swift Reference
Swift 프로그래밍 레퍼런스
Swift Reference 소개
Swift 레퍼런스는 Swift 프로그래밍 언어의 핵심 문법을 검색할 수 있는 빠른 참조 가이드로, 기본문법, 타입, 함수, 프로토콜, 옵셔널, 동시성의 6개 카테고리로 구성되어 있습니다. 각 항목에는 문법 패턴, 명확한 설명, Swift 5.x 이상에서 컴파일되는 코드 예제가 포함되어 있습니다. Swift는 iOS, macOS, watchOS, tvOS, visionOS 개발을 위한 Apple의 주요 언어이며, Vapor 같은 프레임워크를 통해 서버사이드 애플리케이션에서도 사용됩니다.
Swift는 컴파일 언어의 성능과 현대적 언어 기능의 표현력을 결합합니다. 타입 시스템은 옵셔널, 값 타입(구조체와 열거형), 프로토콜 지향 프로그래밍을 통해 컴파일 타임에 안전성을 강제합니다. 이 레퍼런스는 조기 종료를 위한 guard 문, 연관 값이 있는 switch 패턴 매칭, 후행 클로저 구문, JSON 직렬화를 위한 Codable 프로토콜, async/await, Task, TaskGroup, 액터를 이용한 현대적 구조화 동시성 모델 등 Swift 고유 패턴을 다룹니다.
if let이나 guard let으로 옵셔널을 언래핑하거나, 기본 구현이 있는 프로토콜 확장을 정의하거나, Codable로 구조체를 JSON으로 인코딩하거나, async let으로 동시 데이터 페치를 만들거나, 액터로 공유 가변 상태를 보호할 때, 이 치트 시트는 정확한 문법을 제공합니다. iOS 개발자, 언어 기본을 배우는 Swift 초보자, 코드 리뷰나 페어 프로그래밍 중 빠른 참조가 필요한 숙련된 개발자를 위해 설계되었습니다.
주요 기능
- let/var 선언, if/else 조건문, for-in 반복문, 패턴 매칭과 범위가 있는 switch, 조기 종료를 위한 guard, 문자열 보간, 후행 구문 클로저, 튜플을 포함한 기본문법
- 메서드가 있는 struct(값 타입), 연관 값과 원시 값이 있는 enum, 복잡한 타입명을 위한 typealias, 타입 캐스팅이 가능한 이기종 컬렉션용 Any/AnyObject를 포함한 타입 시스템
- 이름 있는 외부 파라미터 레이블, 기본값, inout 참조 전달 파라미터, 가변 파라미터, @discardableResult, throws/try/catch 에러 처리를 포함한 함수
- 프로토콜 정의, 기본 구현을 위한 프로토콜 확장, JSON 인코딩/디코딩을 위한 Codable, Equatable/Hashable 적합성을 포함한 프로토콜 지향 프로그래밍
- 옵셔널 타입, if let과 guard let 바인딩, 중첩 접근을 위한 옵셔널 체이닝, nil 합체 연산자(??), 옵셔널 값의 map/flatMap 변환을 포함한 옵셔널 처리
- async/await 함수, 작업 생성을 위한 Task와 Task.detached, 병렬 실행을 위한 async let, 동적 동시성을 위한 TaskGroup, 스레드 안전 상태 격리를 위한 actor를 포함한 현대적 구조화 동시성
- 카테고리 필터링이 가능한 검색 인터페이스, 구문 강조된 Swift 코드 예제, 한국어/영어 이중 언어 콘텐츠
- 모든 예제는 Swift 5.x 컨벤션을 따르며 Xcode 프로젝트, Swift Playgrounds, 서버사이드 Swift 환경에서 호환
자주 묻는 질문
Swift에서 let과 var의 차이점은 무엇인가요?
let은 초기화 후 값을 변경할 수 없는 불변 상수를 선언합니다. var는 재할당 가능한 가변 변수를 선언합니다. Swift는 기본적으로 let을 사용하고 변이가 필요한 경우에만 var를 사용하도록 권장합니다. 컴파일러는 var가 한 번도 변이되지 않으면 let으로 변경하라는 경고를 표시합니다. 참조 타입(클래스)의 경우 let은 참조가 변경될 수 없음을 의미하지만, 객체의 속성은 여전히 수정 가능합니다.
옵셔널은 어떻게 작동하며 왜 중요한가요?
옵셔널은 값이 있거나 없을 수 있는 것을 나타내며, ? 접미사로 선언됩니다(예: String?). nil 케이스를 명시적으로 처리하도록 강제하여, 다른 언어에서 흔한 널 포인터 크래시를 방지합니다. if let(조건부 바인딩), guard let(조기 종료), 옵셔널 체이닝(?.), nil 합체 연산자(??)로 안전하게 언래핑합니다. 값이 확실히 존재하지 않는 한 !를 이용한 강제 언래핑은 피해야 합니다.
Swift에서 struct와 class를 언제 사용해야 하나요?
Swift는 클래스(참조 타입)보다 구조체(값 타입)를 선호합니다. 데이터 모델, 좌표, 설정, 대부분의 타입에는 구조체를 사용하세요. 구조체는 할당 시 복사되고, 기본적으로 스레드 안전하며, 컴파일러 최적화의 이점을 받습니다. 참조 시맨틱(공유 가변 상태), 상속, Objective-C 상호운용성이 필요한 경우 클래스를 사용하세요. Apple 자체 프레임워크도 점점 구조체를 사용하며, SwiftUI 뷰는 모두 구조체입니다.
Swift switch 문에서 패턴 매칭은 어떻게 작동하나요?
Swift switch 문은 모든 케이스를 다루어야 하며(exhaustive) 기본적으로 fall-through가 없습니다. 연관 값이 있는 enum 케이스 매칭, 범위(case 1...10), 튜플, where 절, 값 바인딩(case let x where x > 0)을 지원합니다. 각 case는 연관 값을 바인딩할 수 있습니다: case .success(let data)는 data를 추출합니다. default case는 나머지 가능성을 처리합니다.
Swift의 프로토콜 지향 프로그래밍이란 무엇인가요?
프로토콜 지향 프로그래밍은 클래스 상속 대신 프로토콜과 프로토콜 확장을 코드 재사용의 주요 메커니즘으로 사용합니다. 프로토콜로 동작 계약을 정의하고, 확장을 통해 기본 구현을 제공하며, 여러 프로토콜에 적합함으로써 기능을 합성합니다. 이는 취약한 기본 클래스 문제를 피하고 값 타입을 지원합니다. 주요 예로는 Codable(Encodable과 Decodable 결합)과 자동 합성을 위한 Equatable/Hashable이 있습니다.
async/await와 구조화 동시성은 어떻게 작동하나요?
async로 표시된 함수는 스레드를 차단하지 않고 await 지점에서 실행을 일시 중단할 수 있습니다. 다른 async 컨텍스트 내에서 try await로 호출합니다. Task { }를 사용하여 동기에서 비동기 코드로 브릿징합니다. async let은 여러 비동기 작업의 병렬 실행을 가능하게 합니다. TaskGroup은 결과에 대한 for await 반복과 함께 동적 태스크 생성을 제공합니다. 모든 태스크는 구조화 동시성을 따릅니다: 부모 스코프가 종료되면 자식 태스크는 자동으로 취소됩니다.
액터란 무엇이며 언제 사용해야 하나요?
액터는 동시 접근으로부터 가변 상태를 보호하는 참조 타입입니다. 액터 내부의 속성과 메서드는 격리되어 있어, 외부 호출자는 await를 사용해야 접근할 수 있으며 한 번에 하나의 실행만 보장합니다. 여러 태스크가 공유 상태를 읽고 써야 할 때 액터를 사용하세요. @MainActor 속성은 메인 스레드에서 실행되어야 하는 코드를 표시하며, SwiftUI와 UIKit에서 UI 업데이트에 필수적입니다.
Codable JSON 인코딩과 디코딩은 어떻게 작동하나요?
구조체나 클래스를 Codable(Encodable과 Decodable의 결합)에 적합하게 하면 자동 JSON 직렬화가 가능합니다. JSONEncoder().encode(value)로 Data로 변환하고 JSONDecoder().decode(Type.self, from: data)로 JSON을 파싱합니다. 커스텀 키 매핑은 CodingKeys enum을 통해 수행합니다. 중첩된 타입도 Codable이어야 합니다. 날짜는 encoder.dateEncodingStrategy를 설정합니다. 이것은 대부분의 사용 사례에서 수동 JSON 파싱이나 SwiftyJSON 같은 서드파티 라이브러리를 대체합니다.