프로그래밍iOS 개발자

Swift에서 타입 추론 메커니즘은 어떻게 작동하며, 암시적 타입을 사용할 때 발생할 수 있는 단점은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

Swift는 강력한 타입 추론 메커니즘을 가지고 있습니다 — 이는 컴파일러가 프로그래머가 명시적으로 타입을 지정하지 않아도 값의 타입을 자동으로 결정할 수 있게 해줍니다. 타입 추론은 코드를 간결하게 만들고 "소음"을 줄여줍니다. 예를 들어:

let number = 42 // Int로 추론됨 let name = "John" // String으로 추론됨 let items = [1, 2, 3] // [Int]로 추론됨

하지만 몇 가지 주의사항을 기억해야 합니다:

  • 타입 추론은 값이나 초기화 메서드를 변경할 경우 변경될 수 있습니다 (예: 컬렉션이 비어 있을 때).
  • 암시적 타입은 서로 다른 타입의 값을 결합할 때 예기치 않은 오류를 초래할 수 있습니다.
  • 때때로 타입 추론은 읽기와 디버깅을 어렵게 하는데, 특히 복잡한 제네릭 타입을 사용할 때 그렇습니다.

눈속임 질문

let emptyArray = [] 를 선언하면 변수의 타입은 무엇일까요?

종종 emptyArray가 "무엇이든지"의 배열이거나 [Any]가 될 것이라고 대답합니다. 그러나 실제로 Swift 컴파일러는 타입을 추론할 수 없어서 오류를 발생시킵니다:

let emptyArray = [] // 오류: 빈 컬렉션 리터럴은 명시적 타입이 필요합니다

빈 배열을 사용하려면 타입을 명시적으로 지정해야 합니다:

let emptyArray: [Int] = []

이 주제에 대한 무지로 인한 실제 오류 사례들


이야기

팀은 let params = [:]로 빈 딕셔너리를 추가했으며, 타입이 [String: Any]가 될 것이라고 기대했습니다. 그러나 컴파일러가 타입을 추론할 수 없어 빌드가 실패했습니다. 결과적으로 type inference의 특성 때문에 원인을 알아내는 데 시간이 낭비되었습니다.


이야기

프로젝트에서 함수의 반환 타입이 let value = decode(json)으로 정의되었으며, 개발자는 [String: Any]을 예상하고 있었지만, 모호성 때문에 파서가 Any를 반환하여 런타임 시 타입 변환 오류로 애플리케이션이 다운되었습니다.


이야기

명시적 지정을 하지 않고 서로 다른 타입의 값을 배열에 추가하려고 시도했습니다 — let items = [1, "two", 3.0]. Swift는 타입을 [Any]로 추론했지만, 이는 후속 작업을 위해 동일한 타입의 요소 배열을 예상할 때 로직에서 오류를 초래했습니다.