iOS/Swift

[iOS/Swift] Type Annotations

iosdevlime 2022. 10. 29. 17:47

지난 포스팅에서...

컴퓨터의 메모리 상에 특정값을 저장하기에 앞서

변수와 상수선언하는 과정이 필요하다는 것을 알아보았습니다.

 

 


 

그런데...

앞서 작성된 변수와 상수 선언의 예시를 살펴보면?

var age: Int = 29 // Int?
let nickname: String = "Jason" // String?
var hunger = false // ??? 뭐지

 

선언 키워드(var, let)와 이름(age, nickname, hunger)뒤에

Int, String과 같은 수식어가 뒤따라 작성되는 것을 확인할 수 있습니다.

 

이와 같은 수식어는 뒤에 나오는 데이터(값)의 유형Type을 의미합니다.

 

이번 포스팅은 변수와 상수의 유형을 규정하는 Type Annotations에 대한 내용입니다.

 

 

 


 

 

Type Annotations

컴파일러가 해당 변수와 상수를 통해 저장(선언)된 데이터 값의 유형을 인식하게 하다!

 

 

정의

  • Type Annotations란 무엇인가요?
    • 말 그대로 Annotations, 주석이란 의미를 가지고 있습니다.
    • 변수와 상수의 데이터(값)의 유형을 설명해주는 수식어입니다.

  • 왜 필요한가요?
    • 컴파일러는 변수와 상수의 데이터(값)에 대해 궁금해 합니다.
    • 아래 예시를 살펴보겠습니다.

 

 

 

활용예시

  • (예시1) 변수와 상수 키워드와 이름만 선언하는 경우
    • 아래와 같이 단순히 선언만 할 경우, 컴파일러는 의문을 가지며 오류를 뱉어냅니다.
    • "그래서 그 이름이 어떤 유형(Type)을 가지고 있는데 ? "  
let name // Error! Type annotation missing in pattern
var age  // Error! Type annotation missing in pattern

 

 

  • (예시2) 변수와 상수 키워드와 이름, 유형(Type)을 함께 선언하는 경우
    • 이름 뒤에 세미콜론 (:)을 사용하여 유형(Type)을 작성하는 것이 기본형태입니다.
    • 선언(할당)값은 선택에 따라 초기화(작성)하거나, 생략할 수 있습니다.
let name: String  // 상수(let) 'name'은 String(문자열) 유형이다.
let age: Int  // 변수(var) 'age'는 Int(정수) 유형이다.

 

 


 

 

Type Inference

만약, 유형이 작성되지 않았다면? 컴파일러는 자동으로 유형을 추론한다!

 

 

정의

  • Type Inference는 또 무엇인가요?
    • Swift 언어의 경우, '설계에 의한 안정성'이란 특징이 존재합니다. (참고 : Swift의 특징)
      • 컴파일러는 해당 선언값의 유형이 비어있을때 초기화 된 값 을 토대로 유형(Type)을 자동으로 추론하게 됩니다.
      •   초기화 된 값 이란, 사용자가 해당 변수&상수에 부여한 값을 의미합니다.

 

 

 

활용조건 및 특징

  • 타입추론의 경우, 반드시 '초기값'을 설정해야 합니다.
  • 초기값이 있을 시 편리하게 사용할 수 있다는 장점이 있습니다.

 

 

 

활용예시

  • 유형(Type)없이 변수와 상수의 초기값을 선언하는 경우
    • 유형(Type)이 없어도, 컴파일러는 자동으로 이름(name, age)의 유형을 추론합니다.
    • 컴파일러 💻 : "유형이 없네? 그런데 초기화된 값이 있으니 알아서 설정해줄게"
let name = "HONG GIL DONG"
var age = 30

자동으로 name의 유형을 String 데이터 타입으로 추론

 

 


 

 

Type Annotations vs Type Inference

추론의 결과(Type)가 사용자가 의도하지 않은 값으로 설정될 수도 있다!

 

 

비교결과

  • 그럼, 타입을 작성하지 않아도 되나요?
    • 타입을 미리 규정(Annotations)하는 것이, 추론하는 방식에 비해 컴파일러 처리속도가 빠릅니다.
    • 또한, 의도치 않은 유형이 도출되는 문제를 방지하고자 Annotations을 권장합니다.

 

 

 

유의사항

  • 영화평점을 A부터 F까지 Character란 유형(Type)으로 선언하고자 할때
    • 유형(Type)의 종류는 다양하기 때문에, 추론 시 의도치 않은 유형(Type)값이 선언될 수 있습니다.
    • 컴파일러는, 추론 시 더 큰 범위(위계)의 유형(Type)을 설정하기 때문입니다.
let movieScore = "B"

//'movieScore'는 문자열(String)이 아닌, 문자(Character)의 값으로 생각했으나,
//실제 타입추론 시 'movieScore'의 유형(Type)은..??

개발자는 Character 타입으로의 추론을 희망했으나, 컴파일러는 추론 시 더 큰 위계의 유형으로 파악하므로 String으로 추론됨