스위프트에선 선언과 초기화를 동시에 할 수도 있지만, 분리하여 작성하는 것도 가능하다.
// 선언과 초기화 같이
var day = 21
// 선언과 초기화 분리
var month : Int // 선언
month = 4 // 초기화
선언과 초기화를 분리하여 작성할 시 :Int를 빼면 어떻게 될까?
다음과 같이 위에서 선언한 변수랑 아래의 변수가 따로 인식되는 오류가 발생하게된다.
위에서 :Int란 타입 어노테이션(Type annotation)으로 변수나 상수를 선언할 때 그 타입을 명시적으로 선언해 줌으로써 어떤 타입의 값이 저장될지를 컴파일러에게 알려주는 문법이다. 타입 어노테이션을 사용한 예를 보자.
var month : Int // 명시적인 Int 타입
var name : String // 명시적인 String 타입
var firstCharacter : Character // 명시적인 Double 타입
var height : Float // 명시적인 Float 타입
var kg : Double // 명시적인 Double 타입
var flag : Bool // 명시적인 Bool 타입
하지만 이렇게 타입 어노테이션을 안쓰고 선언과 초기화를 동시에 할 경우 오류가 발생하지 않았었다. 왜 그런걸까? 바로 스위프트에서 제공하는 타입 추론 기능 때문이다.
타입 추론은 변수나 상수를 초기화할 때 입력된 값을 분석해 변수에 적절한 타입을 컴파일러가 스스로 추론하는 기능이다. 초기값으로 변수에 "Hello, World"가 입력되었다면 컴파일러는 스스로 '이 변수의 타입은 String'이라고 추론하는 것이다.이러한 기능 덕분에 변수나 상수에 명시적으로 타입을 지정해주지 않아도 되었던 것이다.
하지만 반드시 우리가 직접 타입을 명시해줘야할 경우 또한 존재한다. 그 경우는 다음과 같다.
1) 선언과 초기화를 분리할 경우
스위프트에서 변수와 상수는 선언하는 시점에 타입이 결정되어야 하는데, 선언과 동시에 값을 초기화할 시엔 자동으로 타입이 결정되어 타입 어노테이션이 필요없는 것이다.
하지만 선언과 초기화를 분리하여 작성하면 타입 추론을 위한 충분한 데이터가 없어 적절한 타입을 추론하기 어려워지게 되는 것이다.
2) 타입 추론으로 얻어지는 타입이 아니여서 다른 타입을 직접 지정할 필요가 있을 경우
// Int 타입 정의
var temp1 = 3
// Float 타입 정의
var temp2 : Float = 3
temp1과 temp2에 같은 3을 대입했으나 결과가 다르게 나온 것을 볼 수 있다. 이는 3의 경우 컴파일러가 타입 추론을 Int형으로 하기 때문인 것을 알 수 있다.
var strValue = "문자열" // String 타입
var chValue = "문" // String? Character?
스위프트는 문자열이든 문자든 " "를 사용한다. 그렇기 때문에 컴파일러는 이를 합리적으로 추론하기위해 넓은 범위의 타입으로 추론을 자연스럽게 하게된다. 즉 chValue = "문"의 경우 컴파일러가 String 타입으로 추론하게 된다는 것이다.
그렇기 때문에 Character 타입으로 정의하기 위해선 반드시 다음과 같이 타입 어노테이션을 명시해줘야 한다.
var strValue = "문자열" // String 타입
var charValue : Character = "문" // Character 타입
동일한 값이라도 마찬가지이다.
var cValue : Character = "C" // Character
var sValue = "C" // String
앞의 두 가지 경우를 제외한 나머지는 타입어노테이션을 생략하고 타입 추론에 의존해도 큰 문제는 없다.
출처 : 꼼꼼한 재은씨의 Swift 문법편
'Swift > 문법' 카테고리의 다른 글
스위프트(Swift) - 멀티 라인 스트링 (0) | 2022.04.25 |
---|---|
스위프트(Swift) - 타입이 다른 변수끼리의 결합, 문자열 템플릿 (0) | 2022.04.23 |
스위프트(Swift) - 기본 자료형 (0) | 2022.04.20 |
스위프트(Swift) - 변수와 상수 (0) | 2022.04.19 |
스위프트(Swift) 공부하기 (0) | 2022.04.19 |