본문 바로가기
🍎 iOS/문서읽기

[Swift] 변수(var), 상수(let), 타입 어노테이션(type annotation), 타입추론

by @Eddy 2022. 4. 2.
728x90

<변수(var), 상수(let)>

 변수와 상수는 개발자가 값을 기억하기 위해 정의하는 이름이라고 볼 수 있다. 마치 이름모르는 사람을 설명할 때는 어떻게 생겼고, 어디서 일하고 등은 머릿속에 있는 정보를 말로 설명하려면 복잡하지만, 김땡땡씨 라고 기억하고 있다면 언제든 '김땡땡씨' 라고 언급하기만 해도 누구나 알 수 있다는 것과 유사하게 이해하면 될 것 같다.

 

 -변수(var) = 변할 수 있는 수: 필요에 따라 저장된 값을 다른 값으로 변경할 수 있다. 다만, 변경 시 같은 타입이어야 함. ( ex) 정수 -> 정수 )

 -상수(let) = 변할 수 없는 수: 한 번 저장된 값은 변경할 수 없다.

 

 상수로 정의하는 이유는 값이 실수로 변경되는 것을 방지하고, 값의 성격이 명확히 분류되어 관리가 효율적이기 때문인데 변수나 상수 둘 중 어느 것으로 정의할 지 모르겠다면, 그냥 변수로 정의하자. 오랫동안 변경되지 않은 값이라면 컴파일러가 조언해 줄 것이다.

 

 

<타입추론과 타입 어노테이션>

 

Swift의 특징인 설계에 의한 안정성(Safety by design)을 위해 도입한 장치 중 하나인, 타입 추론변수(var)나 상수(let)의 선언 시 입력된 초기값을 이용하여 가장 적절한 타입을 추론해내는 과정이다.

예를 들면, 아래와 같다.

var year = 1999  // year의 타입(type)을 지정해주지 않아도 정수(int)타입으로 인식.
var name = "홍길동" // name의 타입(type)을 지정해주지 않아도 문자열(string)타입으로 인식.

 

타입 어노테이션(type annotation) 변수(var)나 상수(let)을 선언할 때, 그 타입을 명시적으로 선언해 줌으로써 어떤 타입의 값이 저장될 것인지를 컴파일러에 직접 알려주는 문법이다. ex) :int / :string / :character / :Float

var year: int = 1999  // year를 정수(int)타입으로 지정.
var name: string = "홍길동"  // name을 문자열(string)타입으로 지정.

 

즉 타입추론은 타입 어노테이션 과정을 생략해주는 것이라고 할 수 있는데, 그럼 뭐하러 귀찮게 타입 어노테이션을 하냐! 라는 생각이 들 것이다. 

간단히 이야기하자면, 타입추론은 개발의 편의를 위한 것일뿐 항상 개발자가 원하는 답을 주는 것이 아니라는 것이다. 

타입 어노테이션을 반드시 사용해야하는 경우는 크게 2가지가 있다.

 

 

<타입어노테이션을 사용해야만 하는 경우>

 

1. 선언과 초기화를 분리할 경우

var nowYear: Int  // 선언 + 타입 어노테이션
    
var nextYear  // 선언 -> Type annotation missing in pattern

beforeYear = 2021  //  초기화  -> Expected 'var' keyword in property declaration
	           //           Insert 'var '

 - 선언+타입 어노테이션의 경우, 현재 정한 값은 없지만 추후 정할 여지가 있을 때 사용한다.

 - 하지만 선언 또는 초기화만 되어있는 경우, 오류가 발생한다.

   1) 타입 어노테이션을 빼먹었어요

   2) 프로퍼티 선언에 필요한 키워드를 빼먹었으니 넣어주세요.

 

2. 타입 추론으로 얻어지는 타입이 아닌, 다른 타입을 직접 지정할 필요가 있을 때

 앞에서 타입추론은 개발의 변의를 위한 것을뿐, 항상 개발자가 원하는 답을 주는 것이 아니라고 했었다.

var numberSection1 = 1  // 타입추론에 의해 정수(Int)타입으로 정의
var numberSection2: Float = 2  // 실수(Float)타입으로 정의

var numberSection3: "3"  // 타입추론에 의해 문자열(String)타입으로 정의
var numberSection4: Character = "4" // 문자(Character)타입으로 정의

 - 개발자가 원하는 형식으로 정의가 가능하다.

 

 

<타입이 다른 변수끼리의 결합>

 스위프트에서는 다른 타입과의 결합 연산은 허용되지 않고, 다른 타입으로 변경할 수도 없다.

다만, 스위프트의 기본 자료형 객체들은 다른 타입의 값을 자신의 타입에 맞게 변환하여 새로운 객체로 만드는 방법을 제공한다.

여기서 객체는 일반적으로 변수(var)나 상수(let)을 말한다.

ex) String()

var myInfo = "내가 가진 책의 번호는"  // 타입추론에 따른 String타입
var bookNumber = 20  // 타입추론에 따른 Int타입

var myInfoBookNumber = myInfo + String(bookNumber) //String(Int)로 Int객체를 String객체로 변환

// 결과값 = 내가 가진 책의 번호는 20

 

 

반응형

댓글