3.3.2 타입 추론과 타입 어노테이션
타입 어노테이션(Type annotation)이란, 변수나 상수를 선언할 때 그 타입을 명시적으로 선언해 줌으로써 어떤 타입의 값이 저장될 것인지를 컴파일러에 직접 알려주는 문법입니다. 변수나 상수명 뒤에 콜론(:)을 붙이고, 이어서 저장될 값의 타입을 작성해주면 됩니다.
var year : Int // 명시적인 Int 타입
var name : String // 명시적인 String 타입
var firstChar : Character // 명시적인 Character 타입
var distance : Double // 명시적인 Double 타입
var pi : Float // 명시적인 Float 타입
var flag : Bool // 명시적인 Bool 타입
앞에서는 변수나 상수를 선언할 때 타입을 명시해 준 적이 없었고, 그냥 값만 넣어서 초기화 해주었는데, 여기서는 타입이 명시되어 있습니다. 이 부분은 왜 그럴까요?
이 궁금증을 해소하기 위해 우리는 먼저 타입 추론에 대해 학습해 볼 필요가 있습니다. 1장에서 배운 스위프트의 특성 중에 설계에 의한 안전성(Safety by design)이라는 항목이 있습니다. 아키텍처적인 안전성을 담보하기 위해 스위프트가 여러 장치를 도입했다는 것이 핵심 내용이었죠. 그 중의 하나가 바로 타입 추론 기능입니다.
타입 추론은 변수나 상수를 초기화할 때 입력된 값을 분석하여 변수에 적절한 타입을 컴파일러가 스스로 추론하는 기능입니다. 초기값으로 "Hello, World"가 입력되었다면 ''아, 이 변수의 타입은 String 타입이겠군!' 이라고 추론하는 것등이 이에 해당합니다. 이 덕분에 우리는 변수나 상수에 명시적으로 타입을 지정해 주지 않아도 되었던 겁니다. 웬만한 값들은 타입 추론 기능에 의해 적절한 타입이 지정될 테니까요.
// 타입을 명시한 변수 선언
var name : String = "홍길동"
var year : Int = 1999
// 타입을 명시한 상수 선언
var firstName : String = "이"
var birthYear : Int = 1980
// 타입을 명시하지 않은 변수 선언
var name = "홍길동"
var year = 1999
// 타입을 명시하지 않은 상수 선언
let firstName = "미"
let birthYear = 1980
그렇다면 타입 어노테이션을 써야 할지 말아야 할지 고민이 될 때는 어떻게 해야 할까요? 결론부터 말하자면, 반드시 타입 어노테이션을 사용해야 하는 다음 두 가지 경우를 제외하면 타입을 명시적으로 선언하지 않아도 됩니다.
선언과 초기화를 분리할 경우
타입 추론으로 얻어지는 타입이 아닌, 다른 타입을 직접 지정할 필요가 있을 때
// 선언. + 타입 어노테이션
var year : Int
// 초기화
year = 1999
// Int 타입으로 정의
var temper1 = 3
// Float 타입으로 정의
var temper2 : Float = 3
var stringValue = "문자열" // String 타입
var charValue : Character = "문" // Character 타입
var cValue : Character = "C" ;// Character 타입
var sValue = "C" // String
앞의 두 가지 경우를 제외한 나머지는 타입 어노테이션을 생략하고 타입 추론에 의존하면 됩니다. 다른 이유로 타입 어노테이션을 무조건 사용하려는 분도 있습니다.
Last updated