🔥 타입 안전성과 타입 추론

400자
6분

Swift는 타입 안전(Type Safe) 언어입니다. 타입 안전 언어는 코드가 다룰 수 있는 값의 타입을 명확히 하도록 유도하지요. 만약 코드의 일부분이 String을 필요로 한다면, 실수로 Int를 전달할 수 없답니다.

func greet(name: String) {
    print("Hello, \(name)!")
}
 
let age = 25
greet(name: age) // 컴파일 에러: Cannot convert value of type 'Int' to expected argument type 'String'
swift

위 코드에서 greet 함수는 String 타입의 name 매개변수를 받습니다. 하지만 Int 타입인 age를 전달하려 하니 컴파일러가 에러를 발생시키네요.

Swift는 타입 안전하기 때문에 코드를 컴파일할 때 타입 검사(Type Check)를 수행하고 일치하지 않는 타입을 오류로 표시합니다. 이를 통해 개발 과정에서 가능한 한 빨리 오류를 발견하고 수정할 수 있어요.

타입 검사는 서로 다른 타입의 값을 다룰 때 오류를 피하는 데 도움을 줍니다. 그렇다고 선언하는 모든 상수와 변수의 타입을 지정해야 하는 것은 아니에요. 값의 타입을 지정하지 않으면 Swift는 타입 추론(Type Inference)을 사용하여 적절한 타입을 파악합니다. 타입 추론을 통해 컴파일러는 제공된 값을 검사하여 코드를 컴파일할 때 특정 표현식의 타입을 자동으로 유추할 수 있죠.

let count = 5 // count는 Int로 추론됨
var message = "Hello" // message는 String으로 추론됨
swift

위 코드에서 countmessage의 타입을 명시하지 않았지만, Swift는 각각 IntString으로 추론합니다.

타입 추론 덕분에 Swift는 C나 Objective-C와 같은 언어에 비해 훨씬 적은 타입 선언을 요구합니다. 상수와 변수는 여전히 명시적으로 타입이 지정되지만 타입을 지정하는 작업의 많은 부분이 Swift에 의해 수행되는 거죠.

특히 상수나 변수를 초기값과 함께 선언할 때 타입 추론이 유용합니다. 이는 종종 선언 시점에 상수나 변수에 리터럴 값(Literal Value) 또는 리터럴(Literal)을 할당하여 이루어집니다. (리터럴 값은 423.14159와 같이 소스 코드에 직접 나타나는 값입니다.)

예를 들어, 새로운 상수에 42라는 리터럴 값을 할당하고 그 타입을 지정하지 않으면 Swift는 정수처럼 보이는 숫자로 초기화했기 때문에 해당 상수를 Int로 유추합니다.

let meaningOfLife = 42
// meaningOfLife는 Int로 추론됨
swift

마찬가지로 부동 소수점 리터럴에 대한 타입을 지정하지 않으면 Swift는 Double을 생성하려는 것으로 유추합니다.

let pi = 3.14159
// pi는 Double로 추론됨
swift

Swift는 부동 소수점 숫자의 타입을 유추할 때 항상 Float이 아닌 Double을 선택합니다.

표현식에서 정수 리터럴과 부동 소수점 리터럴을 결합하면 컨텍스트에서 Double 타입이 유추됩니다.

let anotherPi = 3 + 0.14159
// anotherPi도 Double로 추론됨
swift

3이라는 리터럴 값 자체에는 명시적인 타입이 없으므로 덧셈의 일부로 부동 소수점 리터럴이 존재한다는 점에서 Double이라는 적절한 출력 타입이 유추되는 것이죠.

이처럼 Swift의 타입 추론은 코드를 간결하게 유지하면서도 타입 안전성을 보장하는 강력한 기능입니다. 개발자가 모든 타입을 일일이 명시하지 않아도 되므로 생산성을 높일 수 있죠. 하지만 타입 추론에 너무 의존하다 보면 코드의 가독성이 떨어질 수 있으니 적절한 타입 명시와 균형을 이루는 것이 중요합니다.