Swift를 처음 배울 때 가장 먼저 만나는 문법 중 하나는 바로 변수(var) 와 상수(let) 이다. 스위프트의 공식 문서를 확인해 보아도 좌측 최상단 메뉴의 A Swift Tour 와 The Basics 메뉴에서는 이 변수(var)와 상수(let)로 시작 한다.
✅ var 키워드의 의미와 어원
- var는 variable의 줄임말이다.
- 영어로 variable은 "변할 수 있는 것, 변수" 라는 뜻이다.
- 프로그래밍 전통에서 var는 C계열 언어나 JavaScript 등에서도 변할 수 있는 값을 선언할 때 흔히 쓰는 키워드이다. Swift도 이 익숙한 전통을 이어받아, 값이 바뀔 수 있는 저장소를 var로 선언하도록 한 것이다.
✅ let 키워드의 의미와 어원
- let은 "let x equal 5"처럼 수학적인 표현에서 따온 키워드이다.
- 즉, "x를 5라고 하자" 또는 "x를 5라고 저으이하자" 라는 의미이다.
많은 언어들에서 상수를 const라는 키워드로 표현한다. 하지만 Swift는 "더 읽기 쉽고 선언적(declarative)"인 문법을 지향한다. 그래서 "상수는 어떤 값이라고 정의하자(let it be)"는 의미의 let을 사용했다. 이건 Swift 문법 전반에 걸쳐 영어 문장처럼 읽히도록 설계된 일환이기도 하다.
그렇다면, 대체 언제 변수(var)를 쓰고, 언제 상수(let)을 써야 하는 걸까?
SwiftUI로 앱을 만들던 초반에는 생각 없이 var를 사용하거나 다른 자료를 참조하는대로 var와 let을 무작위로 선언했었다. 그러다 보니 나중에 코드가 복잡해질수록 내가 만든 코드임에도 불구하고 "이 값은 바뀌는 건가?" 하는 혼란이 시작되었다. 바이브코딩을 하며 인공지능도 이부분은 실수를 많이 한다. 덕분에 앱이 크래시 나거나 이상한 동작을 할 때마다 var 나 let 이냐의 작은 차이가 얼마나 큰 문제로 이어지는지 체감하게 되었다.
이번 포스팅은 그런 시행착오 속에서 얻은 경험을 바탕으로, 단순한 문법 설명을 넘어서 언제 var를 쓰고, 언제 let을 쓰는 게 좋은지를 메모리 관점, 안전성 관점, 코드 가독성 관점으로 정리해보려고 한다.
var와 let의 기본 정의
Swift에서 값을 저장하는 변수는 var, 상수는 let 으로 선언한다. 예를 들면 다음과 같다.
var name = "조현성"
let birthYear = 1985
- var는 값이 바뀔 수 있다 (mutable).
- let은 값이 한 번 정해지면 절대 바뀌지 않는다 (immutable).
무조건 let을 써야 하는 이유?
스위프트 공식 문서에 다음과 같은 글이 언급되어 있다. 또한, 애플 개발자 문서를 확인해 보아도 State 나 Binding 과 관련하여 var 사용시 조심해야 한다는 내용이 자주 등장하며, 변경 가능성에 대해서는 신중하게 접근할 것을 암시한다.
왜일까? 사실 대부분의 경우에서, 값이 바뀌지 않는다는 보장이 있으면 코드가 더 안전해지고, 디버깅도 쉬워지기 때문이다. 값이 바뀌지 않는다는 건, 예상하지 못한 변경이 없다는 뜻이고, 다른 코드가 이 값을 변경할 수 없다는 뜻이고, 결과적으로 버그가 생길 가능성이 낮아진다는 뜻이다.
let userID = "johjo"
userID = "johyunsung" // ❌ 에러 발생: 변경 불가
var를 남발하면 생기는 문제
var age = 30
func birthday() {
age += 1
}
이렇게 선언해두면 age 는 프로그램 어디에서나 바뀔 수 있다. 작은 앱에선 괜찮을 수 있다. 하지만 앱이 커지고, 데이터 흐름이 복잡해질수록 이런 변수들은 "누가 언제, 어디서 바꿨는지를 알 수 없는 폭탄"이 된다.
반대로 let을 사용했을 때의 안전성
let age = 30
func birthday() {
age += 1 // ❌ 컴파일 에러
}
컴파일 에러가 난다는 건 내가 실수로 잘못된 코드를 짜는 걸 미리 막아준다는 뜻이다. 즉, Swift의 안전성이 작동하고 있다는 뜻이다.
메모리 관점에서의 var vs let
값이 자주 바뀐다는 건, 메모리에서도 그만큼 값을 다시 저장하고 참조해야 한다는 비용이 발생한다. 예를 들어 SwiftUI에서는 View가 상태(state)에 따라 재계산(recalculate)되는데 @State var 처럼 값을 바꿀 수 있는 속성이 많아질수록 더 많은 연산이 필요하다. 즉 let을 쓰면, 메모리 할당이 적고, 참조가 단순하며, 캐시가 잘 작동하고, 결과적으로 더 빠르고 안정적인 코드가 된다.
SwiftUI에서 특히 중요한 let
SwiftUI는 선언형(Declarative)이다. 즉, 상태(state)가 바뀔 때마다 View를 다시 그리는 구조다. 따라서 값이 불필요하게 바뀌지 않는다면 let으로 유지하는 것이 불필요한 뷰 업데이트를 줄이고, 성능 문제를 방지하는데 매우 중요하다.
struct ContentView: View {
let title = "josync"
var body: some View {
Text(title)
}
}
반대로 var이 필요한 순간
그렇다면 언제 var를 써야 할까?
1️⃣ 값이 사용자 상호작용에 따라 바뀌는 경우
@State var isOn = false
2️⃣ 네트워크 응답, 타이머, 제스처 등 외부 이벤트로 값이 변경될 때
3️⃣ 배열이나 딕셔너리를 수정해야 할 때
var items = [1, 2, 3]
items.append(4)
하지만 이런 경우에도 가능하면 값이 바뀌는 범위를 최소화 해야 한다. 예를 들어, 전체 View에서 var를 쓰기보다는 @State나 @Binding 으로 최소화된 scope에서만 mutable하게 유지하는 것이 좋다.
var vs let, 당신의 선택은?
질문 | var | let |
이 값은 절대 바뀌지 않아야 하나요? | ❌ | ✅ |
이 값은 사용자에 따라 변경되나요? | ✅ | ❌ |
값을 읽기만 하나요? | ❌ | ✅ |
디버깅하기 쉬운 코드가 되길 바라나요? | ❌ | ✅ |
앱의 성능과 안정성이 중요하신가요? | ❌ | ✅ |
결론적으로, 기본은 let, 예외적인 상황에서만 var이 정석이다. Swift는 이런 철학을 기반으로 설계뙤어 있고, 이를 잘 활용하면 안정적이고 예측 가능한 앱을 만들 수 있다.
마무리하며
나도 처음엔 var와 let을 구분하는게 귀찮고, 모든걸 var로 처리하면 편할 줄 알았다. 하지만 앱이 점점 복잡해질수록, 작지만 잘못된 var 하나가 앱 전체를 뒤흔들 수 있따는 걸 뼈저리게 느꼈다. 이 글을 읽는 당신도, 이제는 고민해보자. "이 값, 정말 바뀌어야 할까?" 그 질문 하나만으로도, 당신의 Swift 코드는 더 간결하고, 빠르고, 안전해질 것이다.
'Programming > Swift' 카테고리의 다른 글
스위프트를 시작하기 전 알아야 할 것들 (0) | 2025.06.27 |
---|