Swift

❓ Type Inference / Type Annotation

_yunie 2024. 6. 21. 23:33

안녕하세요!

오늘은 Swift 문법의 기본 중의 기본을 공부해보려 합니다!

 

 

❓변수 / 상수 선언

두 가지 메인 주제를 다뤄보기 전에 Swift에서 변수와 상수는 어떤 식으로 선언되는지 살펴볼게요!

let name
var age

 

Swift를 막 시작하신 분들도 아시겠지만 Swift에서 상수는 let / 변수는 var로 선언됩니다

하지만 이렇게 무작정 선언해 주면?

 

 

오류가 발생하게 됩니다!

 

간단히 말씀드리자면 name이나 age가 어떤 타입인지 모르겠어~라는 겁니다

컴파일러는 데이터 각각의 자료형에 맞는 메모리를 준비해 두는 역할을 하는데요

막 name과 age를 메모리에 담으려고 봤더니 이 상수/변수가 어떤 자료형인지 알 수 없는 상황인 겁니다..!

 

따라서 우리는 변수와 상수를 선언할 때에 컴파일러를 위해서라도 타입을 명시해주어야 합니다 

 

타입을 명시해 주는 방법에는 총 두 가지가 있는데요!

한 번 차근차근히 알아보겠습니다

 

 

❓타입 추론 (Type Inference)

타입 추론은 어떤 걸까요?

이름만 보면 타입을 추측하는 형태가 아닐까? 하고 생각하게 됩니다

let name = "Yunie"

 

 

방금 선언한 name에 Yunie라는 이름을 초기화해 봅시다

 

그럼 이제껏 뜨던 에러가 사라지는 것을 확인할 수 있습니다

우리는 직접적으로 타입을 명시해 준 적이 없는 것 같은데 왜 그런 걸까요?

 

타입 추론이란 정말 말 그대로 컴파일러가 초기화된 값을 보고 타입을 추론하는 것을 의미합니다

그렇기 때문에 현재 넣어주고 있는 값 Yunie가 String 타입인 것을 확인한 컴파일러는 자연스럽게 name 또한 String 타입이겠구나~ 하고 유추하게 되는 거죠 

 

😆 그럼 초기값이 있을 때는 모두 타입 추론으로 써도 되겠네? 

이렇게 생각하실 수 있지만 타입 추론은 간혹 의도한 대로 타입이 들어가지 않을 수 있습니다

 

예로 height이라는 변수를 190.0으로 타입 추론을 사용해 보면

 

이미지처럼 타입이 Double로 선언되는 것을 확인할 수 있습니다

저는 사실 Float으로 넣고 싶었는데 말이죠

 

또한 같은 예로 Character과 String이 있습니다

String인 Yunie 중에 Y만 넣었으니까 Character라고 생각했는데, 컴파일러는 자동으로 String이라고 타입을 지정해 버립니다

 

이처럼 컴파일러가 초기값을 통해 타입을 추측할 때,  Float인지 Double인지 또는 Character인지 String인지 확실히 하기 애매할 때 둘 중에 더 넓은 범위의 자료형을 타입으로 결정하게 됩니다 

 

그래서 타입 추론이 간편하기는 하지만 때때로 우리가 원하는 타입을 온전히 지정할 수 없는 문제가 생길 수 있습니다

 

🧐 그리고 초기값이 없다면..?

앞서 말씀드린 것처럼 타입 추론은 선언과 동시에 초기화가 진행되어야 가능한 방식입니다

그런데 만약 지금 당장 넣을 초기값이 없다면..?

 

타입 추론 자체가 불가능하게 됩니다

 

이러한 문제들을 해결하기 위해서는 Type Annotation을 사용해 주면 됩니다

 

Type Annotation

 

Type Annotation은 아주 간단한 형태입니다!

 

이렇게 자료형을 직접적으로 명시해 주는 형태거든요!

아까 전과 같은 값을 넣었지만 직접 Float이라고 명시를 해줬기 때문에 height이 Float 형태로 인식됨을 확인할 수 있습니다

 

그리고 간단하게 공식처럼 알려드리자면 아래와 같습니다😉

let 변수명: 자료형
var 변수명: 자료형

 

 

결국 우리가 직접 데이터의 자료형을 알려주고 있기 때문에 컴파일러가 데이터 타입을 유추할 필요가 없어져 초기값 없이도 사용할 수 있으며 컴파일 시간을 조금 절약할 수 있는 효과를 볼 수 있습니다!

 

 

✏️ 오늘의 요약

 

📚 참고

https://hilily.tistory.com/56

https://babbab2.tistory.com/14

 

 

'Swift' 카테고리의 다른 글

❓ Forced Unwrapping  (0) 2024.06.26
❓ Optional  (0) 2024.06.24
❓ 접근 제어(Access Control)  (0) 2024.06.17
❓ Delegate와 DataSource의 차이  (1) 2024.06.10
❓ 타입 프로퍼티  (2) 2024.06.07