jane1choi/TIL

[Swift] 타입 추론과 타입 어노테이션

Closed this issue · 0 comments

타입 추론(Type Inference)과 타입 어노테이션(Type Annotation)

합동세미나에서 팀원의 코드리뷰를 하며 아래와 같은 코멘트를 달았는데요!

스크린샷 2022-05-20 오후 2 14 38

타입 추론을 변수와 상수 선언 시 자연스럽게 사용하고 있었지만, 이 코멘트를 계기로 정확히 알고 넘어가고 싶어서
Swift에서 자료를 명시하는 두가지 방법인 타입 추론과 타입 어노테이션을 비교하며 정리해보려고 합니다!

Swift에서의 상수, 변수 선언

  • let : 상수 선언 키워드
  • var : 변수 선언 키워드
let 상수명: 타입 =var 변수명: 타입 =// 선언 예시
let name: String = "Eunju"
var age: Int = 20

위와 같이 letvar 키워드를 이용해 상수나 변수를 선언할 수 있습니다.
그런데 여기서 타입을 빼고 아래와 같이 써준다면?? 에러가 날까요?

타입 추론(Type Inference)

let name = "Eunju"
var age = 20

정답은 이렇게 선언하는 것도 가능합니다!!

스크린샷 2022-05-20 오후 10 21 35

위와 같이 상수, 변수의 타입도 정확히 나오는 것을 확인할 수 있습니다.
예시와 같이 변수나 상수를 생성할 때 데이터 타입을 생략하면 컴파일러가 변수 값의 타입을 추론하여 타입을 지정해줍니다.
이를 타입 추론(Type Inference) 이라고 합니다.
타입 추론은 애플에서도 Swift의 강력한 기능이라고 소개하고 있습니다.
간결하게 변수나 상수 선언을 해줄 수 있다는 점이 장점이겠죠?

타입 추론의 문제점

하지만, 타입 추론에도 문제점이 몇가지 존재합니다.

1. 타입 추론으로 얻어지는 타입이 원하는 타입이 아닐 경우
타입 추론 기능이 내가 원하는 대로 되지 않는 경우가 있습니다.
예시로 보겠습니다!

let num = 10.0

Float 타입의 상수를 선언해주려고 위와 같이 선언했습니다.

스크린샷 2022-05-20 오후 10 47 17

하지만, num의 자료형은 위와 같이 Float형이 아닌 Double형으로 잡히게 됩니다.

원하는 값이 추론되지 않는 이유는 컴파일러가 초기값을 통해 자료형을 유추할 때
Float/Double, Character/String 과 같이 애매한 타입의 경우, 더 큰 범위의 자료형으로 지정하기 때문입니다.
(Float -> Double, Character -> String)
이 때문에 원하는 타입으로 추론이 되지 않는 경우가 생깁니다.

2. 초기값이 없는 경우(선언과 초기화를 분리할 경우)
선언과 초기화가 동시에 이루어지지 않고, 선언과 초기화가 분리된 구문으로 작성될 경우 타입 추론을 위한 충분한 데이터가 없어 적절한 타입을 추론할 수 없게 됩니다.

이렇게 타입 추론으로 문제가 생기는 경우, 타입 어노테이션(Type Annotation)을 사용해야 합니다.

타입 어노테이션(Type Annotation)

변수나 상수를 선언할 때 그 타입을 명시적으로 선언해 줌으로써 어떤 타입의 값이 저장될 것인지를 컴파일러에 직접 알려주는 문법을 타입 어노테이션(Type Annotation)이라고 합니다.

let name: String = "Eunju"
var age: Int = 20

이렇게 첫 예시와 같이 써주는 방식입니다!

타입 어노테이션 방식으로 변수나 상수를 선언할 경우에는 타입을 명시해줬으므로 초기값이 없어도 됩니다.
추가적으로 타입 어노테이션 방식이 속도 면에서의 장점도 있습니다.
타입 추론은 컴파일러가 타입을 추론하는 과정에서 타입 어노테이션보다 시간이 조금 더 걸린다고 합니다!
속도 차이가 크진 않겠지만 큰 프로젝트의 경우 차이가 꽤 날 수도 있겠네요!

참고자료: https://babbab2.tistory.com/14, https://vincentgeranium.github.io/swift/2019/03/12/Swift-Study-5.html