본문 바로가기

개발/쉽게 풀어보는 Swift

타입(Type)

사람은 태어나서 이름을 갖고 자기 성격대로 살게됩니다. 성격이 맞는 사람들끼린 잘 지내고 성격이 안 맞는 사람끼린 쉽게 어울릴 수 없죠.

또, 누군가 소개받을 때 "그 사람은 어떤 타입이야?" 라고 물어보곤 합니다.

우리는 이전 글에서 이라는 것을 공부했습니다. 값도 프로그래밍 세계에서 태어났어요. 그래서 우리는 이름도 지어줘야하고 어떤 성격인지도 정해줘야합니다. Swift에는 다양한 성격(타입)들이 있습니다. 그 중 기본이 되는 몇 가지만 먼저 알아볼게요.

 


Integer (Int)

첫 번째는 Integer, 정수입니다. 정수는 ...-2, -1, 0, 1, 2... 를 의미하죠. 사실 이 정수라는 타입은 더 다양하게 설명이 가능해요.

먼저 Int32Int64가 있어요. Int 뒤에 숫자가 더 클수록 표현할 수 있는 정수가 더 많다는 것을 의미합니다.

뒤에 숫자는 무엇일까요? 바로 비트(bit) 수를 의미하는데요. 단순하게 표현하면 옛날 아이폰은 되게 내성적이라 표현력이 부족하고, 상대적으로 요즘 아이폰은 덜 내성적이라 표현력이 많이 좋아졌다고 생각하면돼요.

우리가 뒤에 숫자를 생략하고 그냥 Int라고 쓰면 Swift는 알아서 옛날 핸드폰이면 Int32타입으로, 요즘 핸드폰이면 Int64타입으로 타입을 결정합니다. 

단, 내성적인 Int32에게 너무 많은 표현력을 요구하면 힘들어하겠죠? 그 부분만 주의해서 사용해주세요.

 

하나 더 있습니다. UInt라는 타입이 하나 더 있어요. Int 앞에 붙은 U는 Unsigned를 의미하는데 이건 양의 정수만 처리하겠다는 의미입니다. 양의 정수만 처리한다는 의미는 음의 정수를 처리할 수 있는 만큼 양의 정수를 더 처리하겠다는 의미입니다. 그렇게 처리하라고 했는데 UInt 타입에게 갑자기 음의 정수를 준다면 UInt가 싫어할테니 주의해주세요.

 

이렇게 간략하게 정수 타입에 대해 설명했는데, 사실 정수 타입과 친구 관계인 실수를 나타내는 Float도 있어요. 그리고 Int나 Float보다 2배 성격 좋고 실수로도 나타낼 수 있는 Double도 있습니다. 소수점 처리나 더 큰 수를 처리할 때 Float이나 Double을 사용합니다.

 

타입을 나타내는 코드는 이렇게 작성하면 됩니다.

let integerNumber: Int = 1
let floatNumber: Float = 1.0
let doubleNumber: Double = 1

String

두 번째는 String, 문자열입니다. 사용자에게 이런 글을 보여주기 위해선 Swift도 문자를 표현할 수 있어야합니다.

따라서 Swift에선 String이라는 타입을 사용합니다. 이 String은 사실 문자 (Character)의 모음이에요.

즉, Dog!🐶라는 문자열이 있다면 'D', 'o', 'g', '!', '🐶'의 모음인 것 이죠.

 

String은 한 줄을 표현하고 싶다면 이렇게 코드를 작성합니다.

let greeting = "Hi Minseob!"

 

쌍따옴표 3개로 여러 줄도 표현할 수 있어요.

let quotation = """
The White Rabbit put on his spectacles.  "Where shall I begin,
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
"""

 

앗! 우리는 다른 값을 String에 껴서 문자열을 만들 수도 있습니다. 문자열 보간법 (String Interpolation)라 하며 이렇게 사용합니다.

 

let name = "Minseob"
let greeting = "Hi \(name)!"

 

이게 왜 좋은가? 만약 인사말을 전 세계 언어 문자열로 표현했다고 생각해보면 이름이 중복되죠.

 

let korean = "안녕 Minseob!"
let english = "Hi Minseob!"
let spanish = "Hola Minseob!"
...

 

이 때 우리가 이름을 바꿔야한다면 모든 문자열에서 Minseob을 다른 이름으로 변경해야합니다.

그럼 우리는 이름을 값으로 정하고 문자열 보간법을 사용해 그 값을 사용하면, 변경 될 일이 있을 때 그 값만 바꾸면 됩니다.


타입 변환 (Type Casting)

처음 시작할 때 '성격이 맞는 사람들끼린 잘 지내고 성격이 안 맞는 사람끼린 쉽게 어울릴 수 없죠.' 라고 했던 문장이 기억나시나요?

그렇습니다. 프로그래밍을 하다보면 2개의 타입이 합을 맞춰야 할 일이 많습니다. 예를 들어 더하기 연산을 보겠습니다.

 

let integerNumber: Int = 1
let floatNumber: Float = 1.0
let doubleNumber: Double = 1

let sum = integerNumber + doubleNumber // 오류

 

Integer type과 Double type은 서로 다른 타입이기 때문에 더하기 연산이 불가능 합니다. 이런 경우 한 쪽이 조금 양보해야합니다.

이 양보를 우리는 타입 변환(형변환)이라고 합니다. 아래 코드 처럼 말이죠.

 

let integerNumber: Int = 1
let floatNumber: Float = 1.0
let doubleNumber: Double = 1

let sum = Double(integerNumber) + doubleNumber

 

사실 타입 변환은 앞으로 더 다뤄야하는 중요한 개념인데요, 지금은 이 정도만 알아도 좋습니다.


타입 안전성과 타입 추론 (Type Safety and Type Inference)

여기까지 오느라 고생 많으셨습니다. 딱 이거 하나만 더 설명할게요. 간단합니다.

타입 안전성Swift에선 타입을 제대로 사용하지 않으면 컴파일 시점에 오류를 알려준다는 것입니다. 런타임이 아닌 컴파일 시점에 알려주기 때문에 수정에 용이합니다. 런타임 시점은 실행 중 일 때 (Run 중 이라고 생각하시면 편하겠죠), 컴파일 시점은 실행을 위한 준비 단계 정도입니다.

타입 추론은 이렇게 타입을 열심히 지키는 개발자에게 손 아프지 말라고 Swift가 타입을 알아서 정해준다는 것입니다.

 

let one = 1
let onePointZero = 1.0

 

여기서 one의 타입은 Integer, onePointZero의 타입은 Double로 Swift가 자동으로 정합니다.

하지만 우리가 1.0으로 정한 onePointZero가 사실 Float 타입 이길 바랬다면, Swift에게 타입 결정을 맡기지 않고, Float으로 타입을 지정하면 됩니다.

 


이렇게 타입에 대해서 알아봤습니다. 이야기로 풀고 싶었는데, 이 내용은 조금 이야기를 만들기 어려웠네요😭

다음 글은 Collection Type에 대해 알아보겠습니다.

 

고맙습니다.

'개발 > 쉽게 풀어보는 Swift' 카테고리의 다른 글

컬렉션 (Collection)  (0) 2020.10.04
배열 (Array)  (0) 2020.09.29
상수(Constant)와 변수(Variable)  (0) 2020.09.20