본문 바로가기
카테고리 없음

19. Swift의 타입 시스템과 타입 추론(Type Inference)

by swifttt 2025. 4. 7.

 

Swift는 정적 타입 언어(static type language)입니다.
즉, 변수나 상수, 함수의 매개변수와 반환값의 타입이 컴파일 시점에 명확하게 결정됩니다.
이러한 타입 시스템은 코드의 안정성과 성능을 보장하는 중요한 기반이 됩니다.

또한 Swift는 강력한 타입 추론(type inference) 기능을 갖추고 있어, 모든 타입을 명시하지 않아도 컴파일러가 타입을 자동으로 유추할 수 있습니다.
이로 인해 코드가 간결해지면서도, 타입 안전성은 그대로 유지됩니다.

1. 정적 타입 시스템의 장점

정적 타입 시스템의 가장 큰 장점은 컴파일 타임에 오류를 발견할 수 있다는 것입니다.

let name: String = "Swift"
let age: Int = 25

// age = "스물다섯" // 오류: 타입 불일치

이처럼 타입이 명확히 지정되어 있어, 잘못된 타입의 값이 할당될 경우 컴파일 단계에서 바로 오류를 확인할 수 있습니다.

2. 타입 추론의 기본

Swift는 대부분의 경우에서 타입을 명시하지 않아도 타입을 자동으로 추론합니다.

let title = "타입 추론"         // String으로 추론됨
let count = 3                  // Int로 추론됨
let isActive = true            // Bool로 추론됨
let pi = 3.14                  // Double로 추론됨

let 또는 var 선언 시 초기값이 있다면 컴파일러는 그 값을 기준으로 타입을 추론합니다.

3. 함수의 타입 추론

함수 내부에서도 타입 추론이 적용됩니다.

func multiply(a: Int, b: Int) -> Int {
    let result = a * b     // result는 Int로 추론됨
    return result
}

매개변수의 타입이 명시되어 있기 때문에, 내부 변수도 자연스럽게 해당 타입으로 추론됩니다.

4. 컬렉션 타입의 타입 추론

배열이나 딕셔너리 등 컬렉션 타입도 요소의 값을 기준으로 자동 추론됩니다.

let numbers = [1, 2, 3]                     // [Int]
let words = ["Swift", "is", "great"]       // [String]
let dictionary = ["name": "지민", "age": "28"] // [String: String]

값이 다양하거나 명확하지 않다면 명시적으로 타입을 지정해주는 것이 좋습니다.

5. 복합 표현식에서의 타입 추론

타입 추론은 단순한 리터럴뿐 아니라 복합적인 표현식에서도 작동합니다.

let doubledNumbers = [1, 2, 3].map { $0 * 2 } // [Int]

map의 결과 타입은 내부 연산과 클로저의 반환값을 기준으로 추론됩니다.

6. 타입 명시가 필요한 상황

타입 추론이 항상 이상적인 것은 아닙니다. 다음과 같은 경우에는 명시적인 타입 선언이 더 바람직합니다.

    1. 빈 배열을 선언할 때
let emptyArray: [Int] = []
    1. 함수 오버로딩에서 모호성을 제거할 때
let value = 10 as Double
    1. 인터페이스 명확화를 위해
let viewModel: LoginViewModel = MyLoginViewModel()

명시적 타입은 협업과 유지보수 과정에서 코드의 의도를 더 명확하게 전달할 수 있습니다.

마무리

Swift의 타입 시스템은 정적 타입 기반으로 매우 안전하고 강력합니다.
여기에 더해진 타입 추론 기능은 코드를 더욱 간결하게 만들어주며, Swift의 가독성과 생산성을 높이는 데 큰 역할을 합니다.
자동 추론과 명시적 타입 선언 사이의 균형을 잘 유지한다면, 보다 안전하고 효율적인 Swift 코드를 작성할 수 있습니다.