[2편] 변수·상수·기본 타입 — Int, Double, String, Bool 완전 정리

🤖 이 글은 Claude Code(AI)가 작성합니다. | 시리즈 목차 | 이전: 1편

1편에서 varlet, 타입 추론을 간단히 살펴봤습니다. 이번 편에서는 같은 내용을 더 깊이 파고듭니다. Swift의 기본 타입이 Python이나 JavaScript의 그것과 어떻게 다른지, 그리고 왜 그렇게 설계됐는지를 이해하는 것이 목표입니다.


let이 기본이어야 하는 이유

1편에서 var는 변수, let은 상수라고 배웠습니다. Swift 공식 가이드라인은 값이 바뀔 필요가 없다면 항상 let을 쓰라고 권장합니다. 처음엔 다소 귀찮게 느껴지는 이 원칙에는 이유가 있습니다.

코드가 복잡해질수록 “이 변수가 지금 어떤 값을 갖고 있지?”라는 추적이 어려워집니다. 변수가 여러 곳에서 변경될 수 있다면 버그를 찾기도 힘들어집니다. let으로 선언된 값은 선언 시점 이후에 절대 바뀌지 않는다는 보장이 생기고, 이 보장이 코드를 읽는 사람에게 신뢰를 줍니다.

let maxRetries = 3         // 이 값은 절대 바뀌지 않는다
var currentRetry = 0      // 이 값은 반복하면서 바뀐다

코드를 읽는 사람은 let을 보는 순간 “이 값은 추적할 필요가 없다”고 판단할 수 있습니다. 이것이 코드 가독성에 직접적으로 기여합니다.

Xcode도 이 원칙을 강제합니다. var로 선언했지만 값이 한 번도 변경되지 않으면, 컴파일러가 경고를 표시하며 let으로 바꾸라고 제안합니다.


네 가지 기본 타입

Int — 정수

소수점 없는 숫자입니다.

let age = 30
let temperature = -5
let population = 51_000_000  // 밑줄로 자릿수 구분 가능 (값에 영향 없음)

Swift의 Int는 실행 중인 기기의 아키텍처에 따라 크기가 자동으로 결정됩니다. 요즘 Mac과 iPhone은 모두 64비트이므로 IntInt64와 같습니다. 표현 가능한 범위는 약 −9.2조 ~ +9.2조로 일반적인 정수 연산에서 넘칠 일이 없습니다.

특정 크기가 필요할 때는 명시할 수 있습니다(Int8, Int16, Int32, Int64). 하지만 특별한 이유가 없다면 그냥 Int를 씁니다.

Double — 부동소수점 수

소수점이 있는 숫자입니다.

let pi = 3.14159
let height = 172.5
let tiny = 0.000_001

Swift에는 Double(64비트, 약 15자리 정밀도)과 Float(32비트, 약 7자리 정밀도)가 있습니다. 특별한 이유가 없다면 Double을 씁니다. Apple 공식 API도 대부분 Double을 기준으로 설계되어 있습니다.

Bool — 참·거짓

논리값입니다. true 아니면 false, 딱 두 가지만 가질 수 있습니다.

let isLoggedIn = true
let hasError = false

Swift의 Bool은 다른 타입과 절대 혼용되지 않습니다. C나 Python에서는 0false로, 빈 문자열이 false로 취급되는 암묵적 변환이 있지만, Swift에서는 그런 것이 없습니다.

let count = 0
if count {  // 오류: Int는 Bool이 아님
    print("비어 있음")
}

if count == 0 {  // 올바른 방식
    print("비어 있음")
}

String — 문자열

텍스트를 담는 타입입니다. Swift의 String은 처음부터 유니코드 완전 지원을 전제로 설계됐습니다. 한국어, 이모지, 아랍어 등 어떤 문자도 String 하나로 처리합니다.

let greeting = "안녕하세요"
let emoji = "Swift 🚀"
let empty = ""

여러 줄 문자열은 큰따옴표 세 개(""")로 감쌉니다.

let message = """
안녕하세요.
오늘 날씨가 좋네요.
"""

문자열 보간 — \()

문자열 안에 변수나 표현식의 값을 삽입할 때는 \() 문법을 씁니다.

let name = "철수"
let age = 25

print("이름: \(name), 나이: \(age)")
// 출력: 이름: 철수, 나이: 25

print("10년 후엔 \(age + 10)살")
// 출력: 10년 후엔 35살

괄호 안에는 단순 변수뿐 아니라 어떤 표현식도 넣을 수 있습니다. Python의 f-string, JavaScript의 템플릿 리터럴과 같은 역할입니다.


타입 변환 — 암묵적 변환이 없는 이유

Swift에서는 서로 다른 타입 사이의 연산이 자동으로 이루어지지 않습니다.

let a: Int = 10
let b: Double = 3.14

let result = a + b  // 오류: Int와 Double을 더할 수 없음

Python이라면 10 + 3.14는 자동으로 13.14가 됩니다. Swift는 이를 허용하지 않습니다. 대신 명시적으로 변환해야 합니다.

let result = Double(a) + b  // 13.14 — Int를 Double로 명시 변환

번거로워 보이지만 이 제약에도 이유가 있습니다. 암묵적 변환은 때로 예상치 못한 정밀도 손실이나 오버플로를 일으킵니다. Swift는 그 선택을 프로그래머가 의식적으로 하도록 요구합니다.

자주 쓰는 변환 패턴을 정리합니다.

// 숫자 → 문자열
let n = 42
let s = String(n)       // "42"

// 문자열 → 숫자 (실패할 수 있으므로 옵셔널 반환)
let parsed = Int("42")  // Optional(42)
let failed = Int("abc") // nil

// Int ↔ Double
let d = Double(n)       // 42.0
let i = Int(3.99)       // 3 (소수점 버림)

Int("42")Optional(42)를 반환하는 이유는 문자열이 숫자가 아닐 수도 있기 때문입니다. 옵셔널은 7편에서 자세히 다루지만, 지금은 “변환이 실패할 수도 있다는 신호”로만 이해해도 충분합니다.


타입 명시가 필요한 경우

대부분은 타입 추론에 맡기면 됩니다. 하지만 다음 경우에는 타입을 명시하는 것이 좋습니다.

// 1. 초기값 없이 선언할 때
var score: Int
score = 100  // 나중에 값 대입

// 2. 추론되는 타입이 원하는 타입과 다를 때
let ratio = 1 / 3          // Int 나눗셈 → 0
let ratio: Double = 1 / 3  // 여전히 0 (Int 리터럴끼리 나눗셈)
let ratio = 1.0 / 3.0      // Double → 0.333...  ← 이렇게 쓰는 것이 일반적

// 3. 코드를 읽는 사람에게 타입을 명확히 알려주고 싶을 때
let maxFileSize: Int64 = 1_073_741_824  // Int64임을 강조

다른 언어와 비교

Python JavaScript Swift
정수 int (크기 무제한) number Int (64비트)
소수 float number Double / Float
문자열 str string String
참·거짓 bool (0False) boolean (falsy 개념 있음) Bool (오직 true/false)
암묵적 형변환 있음 있음 (== vs ===) 없음
문자열 보간 f"{name}" `${name}` "\(name)"

핵심 요약

  • 값이 바뀔 필요가 없으면 let을 쓴다. Xcode가 불필요한 var를 경고한다.
  • 기본 숫자 타입은 IntDouble, 특별한 이유 없이 이 둘을 쓴다.
  • Swift의 Bool은 오직 true/false만 허용한다. 0이나 빈 문자열을 false로 다루는 암묵적 변환이 없다.
  • 문자열 보간은 "\(변수)" 문법을 쓴다. 괄호 안에 표현식도 들어간다.
  • 타입 간 변환은 항상 명시적으로 해야 한다. Double(someInt), String(someInt) 같은 형태.

다음 편은 3편 — 컬렉션 타입: Array, Dictionary, Set입니다. 여러 값을 묶어서 다루는 세 가지 방법과, 각각 언제 쓰는지를 다룹니다.

🤖 Generated with Claude Code

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다