변수와 상수

변수variable는 값을 수정할 수 있고, 상수constant는 그렇지 않습니다. Swift에서는 언제 어디서 값이 어떻게 바뀔지 모르는 변수보다는 상수를 사용하는 것을 권장하고 있습니다. 그래야 안전하거든요.

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

var name = "Suyeol Jeon"
let birthyear = 1995

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

name = "전수열"

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

birthyear = 2000 // 컴파일 에러!

cannot-assign-to-value-let

Cannot assign to value: 'birthyear' is a 'let' constant

let 키워드로 선언된 상수의 값을 변경할 수 없다는 에러입니다. 이렇게, 바뀌면 안되는 값을 상수로 정의해두면 마음놓고 코딩할 수 있어요.

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

var name: String = "Suyeol Jeon"
let birthyear: Int = 1995
var height: Float = 180.1

nameString이고, birthyearInt고, heightFloat 타입이네요. 이렇게 변수 또는 상수 이름 뒤에 콜론(:)을 붙이고 자료형을 써주면 된답니다. 이 때 사용하는 : String: Int 등을 가지고 타입 어노테이션Type Annotation이라고 합니다. 친구한테 가서 유식한 말 하나 배웠다고 자랑해도 돼요.

Swift에서는 타입을 굉장히 엄격하게 다루기 때문에, 다른 자료형끼리는 기본적인 연산조차 되지 않습니다. 아래와 같이 Int 타입인 birthyearFloat 타입인 height을 더하려고 하면 컴파일 에러가 발생합니다.

birthyear + height // 컴파일 에러!

int-plus-float-error.png

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

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

Float(birthyear) + height // 2175.1

저도 귀찮았는데, 조금만 참고 견디면 금방 익숙해질 거예요. 조금만 응용하면 아래와 같이 숫자를 문자열로 만들 수도 있게 됩니다.

String(birthyear) + "년에 태어난 " + name + "아 안녕!" // 1995년에 태어난 전수열아 안녕!

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

"\(birthyear)년에 태어난 \(name)아 안녕!" // 1995년에 태어난 전수열아 안녕!

타입 추론 (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으로 정의하면 값을 수정할 수 없습니다. 물론 값을 추가하거나 빼는 것도 불가능합니다.

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

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를 호출하는 것인데요. 아래에서 조금 더 자세하게 다룰 예정입니다.

results matching ""

    No results matching ""