티스토리 뷰

Swift 의 기본적인 Data Types 에 대해 알아보겠습니다.

 

1. Data Types

자료형은 메모리에 저장되는 데이터의 종류와 크기를 지정합니다.

 

Swift 에 내장되어 있는 자료형(Built-in Data Type)의 종류는 다음과 같습니다.

- Integer Types: 정수
- Floating-point Types: 실수
- Boolean Types: 참, 거짓
- Character Types: 하나의 문자
- String Types: 하나 이상의 문자 (문자열)

 

데이터를 저장하는 공간인 Memory 에 대해 간단하게 알아보겠습니다.

Memory 는 1과 0을 저장할 수 있는 저장 공간을 가진 반도체를 말합니다.

 

저장단위의 가장 작은 단위는 Bit 입니다. Bit 는 0, 1을 저장할 수 있으며 정보의 기본 단위가 됩니다.

이런 Bit 가 8개 모이면 Byte 라고 합니다. (1Byte = 8Bit)

Byte 는 음수, 양수 모두 저장한다면 -128 ~ 127까지, 양수만 저장하면 0 ~ 255까지 저장 가능합니다.

 

예를 들어 22를 저장한다고 하면 2진수로 바꾸어 00010110이 저장됩니다.

이때 가장 왼쪽 비트를 MSB(Most Significant Bit) - 최상위 비트라고 하고, 가장 오른쪽 비트를 LSB(Least Significant Bit) - 최하위 비트라고 합니다. 전체 비트는 Data Bit 라고 합니다.

 

숫자 저장 자료형은 음수 저장 여부에 따라 2가지로 나눠집니다.

- Signed 자료형: 음수, 0, 양수를 저장

- UnSigned 자료형: 0, 양수를 저장

 

Signed 자료형의 경우 최상위 비트로 양수, 음수를 구분하며 저장되는 방법을 간단히 보면 아래와 같습니다.
- 최상위 비트 0: 양수
- 최상위 비트 1: 음수
- 22 -> 00010110 -> Bitwise NOT 연산 수행 -> 11101001 -> + 1 -> 11101010 (-22)

 

실수 저장의 경우는 아래와 같은 특징이 있다는 것만 알고 우선 넘어가겠습니다.

- 실수 저장은 지수와 가수를 나눠서 저장한다.
- 동일한 메모리 크기에서 정수에 비해 더 넓은 범위를 표현할 수 있다.
- 부동 소수점 오차로 인해서 100% 정확한 실수를 저장할 수 없다.

 

2. Numbers

Swift 에서 숫자 타입은 정수(Integer)와 실수(Floating-point)가 있습니다.

123
+123 // 양수 표시 (+ 생략 가능)
-123 // 음수 표시 (- 생략 불가)

0.23 // 실수 표시 (0 생략 불가)
1.23e4 // 지수 표현 (10진수)
0xAp2 // 지수 표현 (16진수)

1_000_000 // 금액을 처리하는 표현

10 // 10진수 10
0b1010 // 2진수 10
0o12 // 8진수 10
0xA // 16진수 10

 

/*
 # Integer Types
 */

// Int8
// Int16
// Int32
// Int64: 64bit 로 8byte 저장 가능

// 저장할 수 있는 값 범위 확인
Int8.min  // 결과: -128
Int8.max  // 결과: 127

// 메모리 크기 확인 (byte 크기 반환)
MemoryLayout<Int8>.size  // 결과: 1

// Signed vs Unsigned
// Signed: Int8, Int16, Int32, Int64
// Unsigned: UInt8, UInt16, UInt32, UInt64
UInt8.min  // 결과: 0
UInt8.max  // 결과: 255

// Int vs UInt
// 대부분 Int 를 사용하는데 가장 빠르게 정수를 처리할 수 있기 때문
MemoryLayout<Int>.size  // 결과: 8
Int.min  // 결과: -9223372036854775808
Int.max  // 결과: 9223372036854775807


let num = 123
type(of: num)  // 결과: Int.Type
/*
 # Floating-point Types
 */

// Float: 4byte
// Double: 8byte
// 음수, 0 양수 다 저장됨
// 정수보다 큰 값을 저장할 수 있음 (지수와 가수를 나눠서 저장하기 때문)
// 메모리 크기에 따라 소수점 위치가 결정되어 오차가 발생할 수 있음

// 최대 소수점 6자리까지 보장 (그 이후는 오차 가능성 있음, 메모리에는 모두 저장됨)
let pi: Float = 3.141592653589793238462643383279502884197169
print(pi)  // 결과: 3.1415927

// type 지정을 안하면 그냥 Double
// 최대 15자리 소수점 보장
let pi = 3.141592653589793238462643383279502884197169
print(pi)  // 결과: 3.141592653589793

 

3. Boolean

"참" 과 "거짓" 을 나타내는 데이터 타입을 말합니다.

let valid: Bool = true // 참: true, 거짓: false
// let valid: Bool = 0 - 에러

// Boolean 타입의 변수는 has, is 같은 접두어를 주로 붙임
let isValid: Bool = true

let str = ""
str.isEmpty  // 결과: true

// 조건을 판단하는 코드에서 주로 사용됨
if isValid {
    
}

while !isValid {
    
}

 

4. String and Character

/*
 # String
 */

// Swift 에서 문자열은 "" 로 묶여 있음
"Have a nice day"
"123" // 숫자로 구성되어도 "" 로 묶여 있어 문자열
"1" // 하나의 문자라고 해도 "" 로 묶여 있으면 문자열
let str = "1"
type(of: str)  // 결과: String.Type

/*
 # Character
 */

// Swift 에서 하나의 문자는 반드시 타입 지정을 해줘야 함
let ch: Character = "1"
type(of: ch)  // 결과: Character.Type

// Character 문자 타입에는 하나의 문자만 저장할 수 있음
// let doubleCh: Character = "AA" - 에러

// Character 에 빈 문자를 저장하고 싶다면 빈 공백을 넣어야 함
let emptyCh: Character = " "

 

5. Type Inference

자료형을 지정하지 않았다면 초기값을 통해 해당 변수(또는 상수)의 타입을 지정하게 되는데 이를, 타입 추론(Type Inference)라고 합니다.

/*
 # Type Inference
 */

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

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

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

let a = true
let b = false
type(of: a)        // 결과: Bool.Type
type(of: b)        // 결과: Bool.Type


/*
 # Type Annotation
 */

// 자료형을 직접 지정하는 것을 의미함
// let name: Type = value
// var name: Type = value

let n: Int = 123
let value: Double
value = 12.3

let ch: Character = "c"

// 타입 추론을 하면 컴파일 시간이 길어지기 때문에 타입 annotation 을 사용하는 경우가 많음

 

6. Type Safety

/*
 # Type Safety
 */

// 엄격한 구분
// let str: String = 123 - 에러
// let num: Int = 12.34  - 에러

// 같은 타입이라도 저장공간 크기가 다르면 에러
//let a = 7
//let b: Int8 = a

// 자료형의 이름이 다르면 무조건 호환되지 않음
//let a = 7
//let b: Int64 = a

let a = 12
let b = 34.56

// 계산식에 포함된 데이터의 자료형이 같을 때만 계산이 가능
// let result = a + b

let rate = 1.94
let amount = 10_000_000
let result = rate * Double(amount)
type(of: result)

Int(rate * Double(amount))
Int(rate) * amount

 

7. Type Conversion

/*
 # Type Conversion
 */

// Type Conversion: 메모리에 저장된 값을 다른 형식으로 바꿔 새로운 값을 생성
// Type Casting: 메모리에 저장된 값을 그대로 두고 컴파일러가 다른 형식으로 처리하도록 함

// Type(value)

let c = 123
let d = 4.56

Double(c) + d // 123.0 + 4.56
c + Int(d)    // 123 + 4

let e = Int8(c)
let f = Int.max

// Fatal error: Not enough bits to represent the passed value
// let g = Int8(f)

var str = "123"
var number = Int(str)

str = "number"
number = Int(str) // Type Conversion 실패 시 nil 이 반환됨

/*
 # Type Alias
 */

// 기본 자료형에 새로운 이름(별명)을 추가하는 문법
// typealias NewName = TypeName

typealias Coordinate = Double
let lat: Coordinate = 12.34
let lon: Coordinate = 56.78

지금까지 Swift 의 기본적인 Data Type 에 대해 알아보았습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함