🤖 이 글은 Claude Code(AI)가 작성합니다. | 시리즈 목차
이 시리즈의 첫 편입니다. 코드를 한 줄 실행하기 전에, 먼저 Swift라는 언어가 왜 존재하는지 이해하는 것부터 시작합니다. 도구를 쓰기 전에 그 도구가 어떤 문제를 해결하기 위해 만들어졌는지 알면, 나중에 낯선 문법을 만났을 때 “왜 이렇게 생겼지?”라는 질문에 스스로 답할 수 있게 됩니다.
Swift는 왜 만들어졌는가
2014년 이전까지 Apple 플랫폼(macOS, iOS)의 앱은 Objective-C라는 언어로 만들었습니다. Objective-C는 1980년대 설계된 언어로, C 언어에 객체 지향 문법을 덧붙인 형태였습니다. 기능은 충분했지만 문법이 낯설고 실수하기 쉬웠습니다.
2014년 Apple은 Swift를 발표하며 이렇게 말했습니다. “Objective-C without the C.” C 언어의 짐을 내려놓고, 현대적인 언어 설계 원칙을 처음부터 적용한 새 언어라는 선언이었습니다.
Swift가 해결하려 한 핵심 문제는 세 가지였습니다.
- 안전성 — 프로그램이 실행되는 도중에 터지는 오류(런타임 크래시)를 코드를 작성하는 시점에 미리 잡는다
- 속도 — Python처럼 편리하지만, C에 가까운 실행 속도를 낸다
- 표현력 — 같은 의도를 더 적은 코드로, 더 읽기 좋게 쓸 수 있다
지금은 Swift 없이 Apple 플랫폼 개발을 논하기 어렵습니다. Objective-C는 여전히 쓰이지만, 새 프로젝트의 표준은 Swift입니다.
정적 타입 언어 vs 동적 타입 언어
Swift를 이해하는 데 가장 중요한 개념 하나를 고르라면 정적 타입(static typing)입니다.
Python이나 JavaScript는 동적 타입 언어입니다. 변수에 어떤 종류의 값이 들어가는지를 프로그램이 실행될 때 비로소 확인합니다.
# Python
x = 42 # 정수
x = "hello" # 문자열로 바꿔도 오류 없음
x = [1, 2, 3] # 리스트로 바꿔도 오류 없음
유연하지만, 그만큼 실수가 숨어들기 쉽습니다. x가 숫자라고 믿고 계산을 했는데 실제로는 문자열이었다면, 프로그램이 실행되는 순간까지 그 오류를 모릅니다.
Swift는 정적 타입 언어입니다. 모든 변수의 타입이 코드를 컴파일하는 시점에 결정되고, 한번 정해진 타입은 바뀌지 않습니다.
// Swift
var x = 42 // x는 Int 타입으로 결정됨
x = "hello" // 컴파일 오류: Int에 String을 대입할 수 없음
불편해 보일 수 있지만, 이 제약이 오히려 안전망이 됩니다. 실수를 코드 작성 단계에서 잡아주기 때문에, 앱이 사용자 손에서 실행되는 도중에 터지는 일이 줄어듭니다.
컴파일 언어란 무엇인가
Python은 코드를 한 줄씩 읽으면서 바로 실행하는 인터프리터 방식입니다. Swift는 코드 전체를 먼저 기계어로 번역(컴파일)한 뒤 실행합니다.
컴파일 단계가 있다는 것은 두 가지를 의미합니다.
- 실행 속도가 빠르다 — 이미 기계어로 변환된 코드를 실행하므로, 매번 해석하는 과정이 없다
- 오류를 미리 잡는다 — 컴파일러가 전체 코드를 훑으며 타입 오류, 존재하지 않는 함수 호출 등을 실행 전에 알려준다
Xcode에서 코드를 작성하다 빨간 밑줄이 그어지는 것이 바로 컴파일러가 미리 오류를 잡아주는 것입니다.
Xcode 설치
Swift 개발 환경은 Xcode입니다. macOS에서만 동작하는 Apple 공식 IDE(통합 개발 환경)로, Mac App Store에서 무료로 받을 수 있습니다.
App Store에서 “Xcode”를 검색해 설치합니다. 설치 용량이 10GB를 넘으니 시간이 걸립니다. 설치가 끝나면 한 번 실행해 추가 구성 요소 설치를 완료합니다.
버전 확인: 이 시리즈는 Xcode 16, Swift 5.9 이상을 기준으로 합니다. Xcode 메뉴 → About Xcode에서 버전을 확인할 수 있습니다.
Playground: 가장 빠른 Swift 실행 환경
Xcode를 설치했다면 앱 프로젝트를 만들기 전에 Playground를 먼저 써보겠습니다. Playground는 코드를 타이핑하는 즉시 결과를 오른쪽에 보여주는 대화형 실행 환경입니다. Python의 REPL(인터랙티브 셸)과 비슷한 역할입니다.
Playground를 여는 방법:
- Xcode 실행
- 메뉴에서 File → New → Playground 선택
- Blank 템플릿 선택 후 저장
처음 열면 이런 코드가 보입니다.
import Foundation
var greeting = "Hello, playground"
오른쪽 패널에 "Hello, playground"가 표시되면 정상입니다. 이 환경에서 이 시리즈의 코드 예제들을 직접 실행해볼 수 있습니다.
첫 코드 — print, 변수, 타입 추론
Playground에서 아래 코드를 입력해보겠습니다.
print("Hello, Swift!")
콘솔 하단에 Hello, Swift!가 출력됩니다.
이제 변수를 선언해봅니다.
var name = "Alice"
var age = 30
var height = 165.5
var isStudent = true
print(name) // Alice
print(age) // 30
print(height) // 165.5
Swift는 타입 추론(type inference)을 지원합니다. var name = "Alice"라고 쓰면 Swift 컴파일러가 오른쪽 값 "Alice"를 보고 name이 String 타입임을 스스로 판단합니다. 타입을 직접 명시할 수도 있습니다.
var name: String = "Alice"
var age: Int = 30
var height: Double = 165.5
var isStudent: Bool = true
둘 다 동일하게 동작합니다. 타입이 명확한 경우에는 추론에 맡기는 것이 관례입니다.
다음으로 상수를 선언해봅니다. var 대신 let을 쓰면 값을 바꿀 수 없는 상수가 됩니다.
let pi = 3.14159
pi = 3.0 // 오류: 상수는 값을 변경할 수 없음
Swift는 변경이 필요하지 않으면 let을 쓰는 것을 권장합니다. 의도치 않게 값이 바뀌는 실수를 컴파일러가 막아주기 때문입니다.
다른 언어와 비교
| Python | JavaScript | Swift | |
|---|---|---|---|
| 타입 결정 시점 | 런타임 | 런타임 | 컴파일 타임 |
| 변수 선언 | x = 1 |
let x = 1 |
var x = 1 |
| 상수 선언 | (없음, 관례로 대문자) | const x = 1 |
let x = 1 |
| 출력 | print(x) |
console.log(x) |
print(x) |
| 문자열 보간 | f"안녕 {name}" |
`안녕 ${name}` |
"안녕 \(name)" |
| 실행 방식 | 인터프리터 | JIT 컴파일 | AOT 컴파일 |
JavaScript의 let은 변경 가능한 변수이고, Swift의 let은 상수입니다. 같은 키워드가 반대 의미를 가지므로 주의가 필요합니다.
핵심 요약
- Swift는 2014년 Apple이 Objective-C를 대체하기 위해 만든 언어다. 안전성·속도·표현력이 설계 목표다.
- 정적 타입 언어는 타입 오류를 컴파일 시점에 잡는다. 실수가 앱 실행 중 크래시가 되기 전에 알 수 있다.
- Xcode의 Playground는 앱 프로젝트 없이 Swift 코드를 즉시 실행해볼 수 있는 환경이다.
var는 변경 가능한 변수,let은 변경 불가능한 상수다. Swift는let을 기본으로 쓰길 권장한다.- 타입을 명시하지 않아도 Swift 컴파일러가 초기값을 보고 타입을 추론한다.
다음 편은 2편 — 변수·상수·기본 타입입니다. Int, Double, String, Bool 네 가지 기본 타입을 더 깊이 파고들고, 타입 변환이 왜 명시적으로만 허용되는지를 다룹니다.
🤖 Generated with Claude Code