Swift

[SWIFT] 변수와 상수

동호다찌 2022. 10. 27. 11:20

전수열님의 GitBook을 기반으로 정리합니다.


변수와 상수

변수(variable)는 값을 수정할 수 있고, 상수(constant)는 그렇지 않습니다.

Swift에서는 언제 어디서 값이 어떻게 바뀔지 모르는 변수보다는 상수를 사용하는 것을 권장하고 있습니다. 

변수는 var로 선언하고, 상수는 let으로 선언합니다.

// 변수로 선언
var name = "james"

// 상수로 선언
let birthyear = 2022

나중에 제가 만약 이름을 바꾸고 싶다면 바꿀 수 있어요.

name = "jake"

하지만, 아래와 같이 태어난 해를 바꾸려 한다면 컴파일 에러가 발생합니다.

birthyear = 2000 // 컴파일 에러!

 

let 키워드로 선언된 상수의 값을 변경할 수 없다는 에러입니다. 이렇게, 바뀌면 안되는 값은 상수로 정의합니다.

Swift는 정적 타이핑 언어입니다. 변수나 상수를 정의할 때 그 자료형(타입)이 어떤 것인지를 명시해주어야 하는 언어를 말해요.

// 문자열 변수 선언
var name: String = "Jame"

// 정수형 상수 선언
let birthyear: Int = 2002

// 싱수형 변수 선언
var height: Float = 123.4

name은 String이고, birthyear는 Int고, height은 Float 타입입니다. 이렇게 변수 또는 상수 이름 뒤에 콜론(:)을 붙이고 자료형을 써주면 된답니다.

이 때 사용하는 : String과 : Int 등을 가지고 타입 어노테이션Type Annotation이라고 합니다.

Swift에서는 타입을 굉장히 엄격하게 다루기 때문에, 다른 자료형끼리는 기본적인 연산조차 되지 않습니다.

아래와 같이 Int 타입인 birthyear와 Float 타입인 height을 더하려고 하면 컴파일 에러가 발생합니다.

birthyear + height // 컴파일 에러!

Binary operator '+' cannot be applied to operands of type 'Int' and 'Float'

이건 좀 충격적이죠? 일반적인 다른 프로그래밍 언어라면 상상하기 어려운데요. 이럴 때에는 명확하게 다음과 같이 사용해야 합니다.

// 2022 + 123.4
Float(birthyear) + height // 2175.4

 

조금만 응용하면 아래와 같이 숫자를 문자열로 만들 수도 있게 됩니다.

String(birthyear) + "년에 태어난 " + name + " 안녕!" // 2022년에 태어난 James 안녕!

이렇게 쓰면 읽기가 어렵죠? Swift에서는 더 간단하게 작성할 수도 있습니다.

"\(birthyear)년에 태어난 \(name) 안녕!" // 2022 태어난 James 안녕!

타입 추론 (Type Inference)

처음에 사용한 예제에서는 자료형을 명시하지 않았어요. 그런데도 우리는 name이 문자열이라는 것을 알았고, birthyear가 정수형이라는 것을 알았어요.

Swift 컴파일러도 마찬가지로, 큰 따옴표(")로 감싸진 텍스트는 String 타입인 것을 알고, 숫자는 Int 타입인 것을 인식할 수 있습니다. 이렇게 타입을 직접 명시하지 않고도 값을 가지고 정적 타이핑을 할 수 있게 해주는 것을 타입 추론Type Inference이라고 합니다.


배열(Array)과 딕셔너리(Dictionary)

배열과 딕셔너리는 모두 대괄호([])를 이용해서 정의할 수 있습니다. 이렇게요.

var languages = ["Swift", "Objective-C", "Python"]
var capitals = [
  "한국": "서울",
  "일본": "도쿄",
  "중국": "베이징",
]

배열과 딕셔너리에 접근하거나 값을 변경할 때에도 대괄호를 사용합니다.

languages[0] // Swift
languages[1] = "Ruby"

capitals["한국"] // 서울
capitals["프랑스"] = "파리"

참고로, 다른 상수와 마찬가지로 배열과 딕셔너리를 let으로 정의하면 값을 수정할 수 없습니다. 물론 값을 추가하거나 빼는 것도 불가능합니다.

위에서 정의해본 languages와 capitals의 타입은 어떻게 쓸 수 있을까요? 이번에도 대괄호를 써요. 대신, 대괄호 안에 어떤 타입을 받을 것인지를 명시합니다.

var languages: [String] = ["Swift", "Objective-C", "Python"]
var capitals: [String: String] = [
  "한국": "서울",
  "일본": "도쿄",
  "중국": "베이징",
]

만약 빈 배열이나 빈 딕셔너리를 정의하고 싶다면? 이번에도 또 대괄호를 씁니다.
배열과 딕셔너리는 대괄호로 시작해서 대괄호로 끝납니다.

var languages: [String] = []
var capitals: [String: String] = [:]

빈 배열로 선언하는 것을 조금 더 간결하게 하고싶다면, 이렇게 할 수 있어요.

var languages = [String]()
var capitals = [String: String]()

타입 뒤에 괄호(())를 쓰는 것은 생성자Initializer를 호출하는 것입니다.

'Swift' 카테고리의 다른 글

[SWIFT] 튜플(Tuple)  (0) 2022.11.02
[SWIFT] 클래스와 구조체  (0) 2022.10.31
[SWIFT] 함수와 클로저  (0) 2022.10.28
[SWIFT] 옵셔널 (Optional)  (0) 2022.10.27
[SWIFT]조건문과 반복문  (0) 2022.10.27