[Swift] 데이터 타입에 관한 여러 규칙 & 활용(Type Alias 등)

Geon·2022년 7월 17일

Swift 기초

목록 보기
3/10
post-thumbnail

Type Inference (형식 추론)

let num = 123
print(type(of: num)) //결과 : Int

let temp = 11.2
print(type(of: temp)) //결과 : Double

let str = "Swift"
print(type(of: str)) //결과 : String

let isValid = true
print(type(of: isValid)) //결과 : Bool

위의 예시와 같이 별도의 데이터 타입을 지정하지 않았다면 설정한 값에 적합한 데이터 타입을 스위프트에서 자동으로 추론하여 지정해주는 특징을 가진다.

Type Annotation

let num : Int = 123

let value : Double //타입 어노테이션을 사용하면 일단 변수만 선언후, 나중에 값 넣기 가능
value = 12.3

타입 어노테이션은 데이터 타입을 사용자가 직접 지정해주는 방식으로, 시스템에서 값에 맞는 데이터타입을 찾는 과정이 생략되기 때문에 타입 추론을 사용하여 데이터 타입을 지정하는 방식보다 컴파일 속도가 더 빠르다는 장점을 가진다.

Type Safety

형식 안정성이라고도 하며, 값을 잘못된 형식으로 처리해주는것을 스위프트에서 자동으로 방지해주는 기능이다. 이렇게 깐깐한 기능이 사용자 입장에선 불편할수도 있겠지만 이 특징 덕분에 swift는 안정성이 높다는 장점을 가지기도 한다.

let a = 7
let b : Int8 = a //error: cannot convert value of type 'Int' to specified type 'Int8'

Int 자료형은 Int8 < Int16 < Int32 < Int64 = Int 의 순으로 담을 수 있는 수의 범위가 커진다. 위 코드에서 a는 형식 추론에 의해 자동으로 Int 데이터 타입을 부여받았다. 이 a를 Int8로 선언된 b변수에 담으려고 시도하면 오류가 난다.

let a : Int8 = 7
let b : Int = a //error: cannot convert value of type 'Int8' to specified type 'Int'

반대의 경우도 마찬가지다. 스위프트에서는 오버플로우의 발생 등 혹여 모를 오류들을 방지하기 위해 데이터 타입이 다른 변수들간의 대입을 자체적으로 금지시키고 있다.

let num1 = 12
let num2 = 34.56
let result = num1 + num2 //error: binary operator '+' cannot be applied to operands of type 'Int' and 'Double'

또한 스위프트에서는 자료형이 다른 변수들의 계산도 금지시키고 있다.

Type Conversion (형 변환)

그렇다면 스위프트의 엄격한 type safety 규칙을 피해 데이터 타입이 다른 변수들의 계산 등을 하려면 어떻게 해야할까? 답은 형 변환을 이용하는 것이다.

let a = 7
let b = Int8(a)

오류가 발생했던 코드인 let b : Int8 = a 부분을 위와 같이 바꾸어주니 원하는대로 Int8로 변환된 a변수의 값이 b에 오류없이 성공적으로 담긴다.

let num1 = 12
let num2 = 34.56
let result1 = Double(num1) + num2 //46.56
let result2 = num1 + Int(num2) //46

형 변환을 이용하여 같은 데이터 타입으로 변환시켜 성공적으로 계산을 하는 모습이다. 다만 여기서 실수형 -> 정수형으로 변환을 할 경우 소수점 아래의 수들은 모두 버려지면서 변환되는것에 유의하자.

let num1 = Int.max //Int 자료형이 가질 수 있는 최대값(9223372036854775807)
let num2 = Int8(num1) //error: Not enough bits to represent the passed value 

변환할 데이터 타입(변수)의 형식으로 아무렇게 사용한다고 변환이 다 되는 것은 아니다. 위 코드의 경우 형 변환의 문법 자체는 맞았으나, Int 데이터 타입이 가질 수 있는 최댓값은 Int8이 담을 수 있는 한도 용량을 아득히 넘기 때문에 변환 자체가 이루어질 수 없다.

let str = "123"
let num = Int(str) //123

let num2 = 123
let str2 = String(num2) //"123"

이처럼 숫자끼리의 변환뿐만 아니라 문자와 숫자간의 변환도 가능하다.

let string = "number"
let number = Int(string) //nil

위의 코드처럼 타입 컨버전에 실패할 경우 경우엔 오류는 뜨지 않지만 'nil'값을 가지게 된다. nil은 나중에 배울 내용이지만, 간단히 이야기하면 java나 다른 언어들의 'null'과 비슷한 느낌이다.

Type Alias

자료형에 나만의 별칭을 지정하여 사용하는 방법이다. typealias 변수명 = 데이터 타입 의 형식으로 사용한다.

typealias Coordinate = Double
let num1 : Coordinate = 12.34
let num2 : Coordinate = 56.78

print(type(of: num1)) //Double
print(type(of: num2)) //Double

이처럼 Double형에 Coordinate라는 별칭을 지정하여 이 별칭을 사용하여 데이터 타입을 지정해주고, 이를 활용해주는 모습이다. Type Alias는 코드의 가시성 향상, 간소화 등의 이점이 있어 실무에서도 종종 사용한다고 하니 눈에 잘 익혀두도록 하자.

profile
별에 별 지식 저장해놓고 꺼내먹기📚

2개의 댓글

comment-user-thumbnail
2022년 7월 17일

정말 유용하네요!

1개의 답글