트렌드브리프

스위프트 기본 문법, 옵셔널·컬렉션까지 예제로 익히기

게시 · 약 5분 분량

핵심 요약 스위프트 기본 문법의 핵심은 let·var 선언, 타입 추론, 옵셔널의 nil 안전 처리, 함수, 컬렉션이다. 공식 문서 기준으로 처음 배우는 개발자가 실무 예제로 바로 익히도록 정리했다.

목차
  1. 상수는 let, 변수는 var
  2. 옵셔널은 왜 필요한가
  3. 함수와 제어 흐름
  4. 배열·딕셔너리·세트 다루기
  5. 기본 문법 다음엔 뭘 배워야 하나

스위프트 기본 문법의 뼈대는 다섯 가지다. 상수와 변수 선언(let·var), 타입 추론, 옵셔널, 함수, 제어 흐름. 이 다섯만 손에 익으면 웬만한 예제 코드는 읽고 고칠 수 있다. 스위프트 공식 문서 The Swift Programming Language를 기준으로, 2026년 7월 기준 최신인 스위프트 6.x에서도 그대로 통하는 핵심만 실무 예제로 추렸다. 이 글은 iOS든 서버든 스위프트를 처음 접하는 개발자를 위한 것이라, SwiftUI 같은 프레임워크나 동시성 같은 심화 주제는 다루지 않는다.

상수는 let, 변수는 var

스위프트 공식 문서는 값이 바뀌지 않는 상수는 let으로, 바뀔 수 있는 변수는 var로 선언하라고 안내한다. 컴파일러가 대입한 값을 보고 타입을 자동으로 정하기 때문에(타입 추론), 대부분은 타입을 직접 적지 않아도 된다. 타입을 분명히 밝히고 싶을 때만 콜론 뒤에 붙인다.

let name = "김개발"  // 상수: 재할당 불가
var count = 0    // 변수: 재할당 가능
count += 1     // count는 이제 1

let pi: Double = 3.14  // 타입을 직접 명시
let ratio = 0.5   // 타입 추론 → Double

상수를 기본으로 쓰고 값을 다시 넣어야 할 때만 var로 바꾸는 습관이 안전하다. 실수로 값을 덮어쓰는 버그를 컴파일 단계에서 걸러 주기 때문이다.

옵셔널은 왜 필요한가

옵셔널은 '값이 없을 수도 있는 상태'를 타입 차원에서 표시하는 장치다. 스위프트는 값이 비어 있을 수 있는 변수라면 타입 뒤에 물음표(?)를 붙이도록 요구하고, 값이 없을 때는 nil로 둔다. 다른 언어에서 흔한 null 참조 오류를 컴파일 시점에 걸러 내려는 설계다.

물음표가 붙은 값은 그대로 쓸 수 없고, 안에 든 값을 꺼내는 언래핑을 거친다. if let이나 guard let으로 값이 있을 때만 안전하게 꺼낸다. 스위프트 진화 제안 SE-0345에 따라 5.7부터는 변수 이름이 같으면 오른쪽 대입을 생략하는 축약형도 쓸 수 있다.

var nickname: String? = nil // 값이 없을 수 있음
nickname = "dev"

if let name = nickname {  // 값이 있으면 name으로 꺼냄
 print("반가워요, \(name)")
}

if let nickname {    // 스위프트 5.7 축약형
 print(nickname)
}

let display = nickname ?? "익명" // 없으면 기본값

상황에 따라 옵셔널을 다루는 방법이 갈린다. 정리하면 이렇다.

방법문법언제 쓰나
if letif let x = opt { }값이 있을 때만 블록 실행
guard letguard let x = opt else { return }값 없으면 조기 종료, 뒤에서 x 계속 사용
nil 병합opt ?? 기본값값이 없을 때 쓸 대체값 지정
강제 언래핑opt!값이 확실할 때만, 없으면 크래시

느낌표를 붙이는 강제 언래핑은 값이 없으면 앱이 그 자리에서 멈춘다. 편해 보여도 실무에서는 되도록 피하고, if let이나 nil 병합 연산자(??)로 대체하는 편이 안전하다.

함수와 제어 흐름

함수는 func로 선언하고, 매개변수 타입과 반환 타입을 화살표(->)로 밝힌다. 반환값이 없으면 화살표를 생략한다. 반복은 for-in, 조건 분기는 if와 switch로 처리한다.

func greet(_ who: String, times: Int) -> String {
 var line = ""
 for _ in 0..<times {
  line += "안녕 \(who) "
 }
 return line
}

let score = 82
switch score {
case 90...100: print("A")
case 80..<90: print("B")
default:  print("C")
}

스위프트의 switch는 가능한 경우를 빠짐없이 처리하도록 요구한다. 다루지 않은 값이 남으면 컴파일이 되지 않아, default를 넣거나 모든 케이스를 적어야 한다. 빠뜨린 분기를 컴파일러가 대신 짚어 주는 셈이다.

배열·딕셔너리·세트 다루기

실무에서 자주 쓰는 컬렉션은 세 가지다. 순서가 있는 배열(Array), 키로 값을 찾는 딕셔너리(Dictionary), 중복을 허용하지 않는 집합(Set). 배열은 대괄호로 묶고, 딕셔너리는 대괄호 안에 키 타입과 값 타입을 콜론으로 이어 적는다.

var langs = ["Swift", "Kotlin"]
langs.append("Rust")   // 배열 끝에 추가

var ports: [String: Int] = ["http": 80, "https": 443]
ports["ssh"] = 22    // 키로 값 지정

let unique: Set<Int> = [1, 2, 2, 3] // 중복 제거 → {1, 2, 3}

컬렉션도 let으로 선언하면 요소를 더하거나 뺄 수 없다. 내용이 바뀌는 컬렉션만 var로 선언하면 실수를 줄인다.

기본 문법 다음엔 뭘 배워야 하나

문법을 어느 정도 익힌 다음 단계는 실제로 돌아가는 코드를 많이 읽고 고쳐 보는 것이다. 스위프트 공식 문서 The Swift Programming Language는 누구나 무료로 볼 수 있고, 애플이 만든 Swift Playgrounds 앱은 코드를 바로 실행하며 문법을 연습하기에 맞춤이다.

국내에서는 '스위프트문법'을 검색하며 '꼼꼼한 재은씨의 스위프트 문법편' 같은 문법 중심 학습서를 함께 찾는 경우도 많다. 어떤 자료로 시작하든, 옵셔널과 클로저를 확실히 잡고 나면 비동기 코드로 넘어가는 흐름이 자연스럽다. 콜백 대신 async/await로 위에서 아래로 읽히는 코드를 쓰는 방법은 비동기 문법을 다룬 글에서 이어서 볼 수 있다.

언어 자체의 소식은 스위프트 공식 사이트 swift.org에서 확인하면 된다. 스위프트 공식 블로그가 스위프트 6.2 배포를 알린 것처럼, 큰 변화는 대개 이곳에 먼저 올라온다.

더 많은 글 보기 RSS 구독