Data Type
Builtin Data Type
integer (정수), floating-point (실수), boolean (참, 거짓), character (문자), string (문자열) 등의
언어에서 미리 제공하는 데이터 타입.
Cutom Data Type
그 외의 사용자가 생성해 사용하는 데이터 타입.
Memory
0과 1 (2진수)을 저장할 수 있는 반도체.
단위는 Bit부터 YB까지.
- Bit
0과 1을 저장. - Byte
Bit * 8
256개의 데이터를 저장(Unsigned : 0 ~ 255, Signed : -128 ~ 127)
Data마다 알맞는 메모리 크기가 있다.
예를 들면 Int 자료형은 8Byte의 메모리를 가짐.
표현 범위는 약 -900경 ~ 900경 까지.
이러한 자료형에 일반적인 데이터(나이, 몸무게 등)을 저장하면 비효율적임.
다만 이미 현재의 컴퓨터 메모리가 4GB 이상의 크기를 가지고 있는 것을 감안하면 대단히 비효율적이진 않음.
메모리 주소
1 Byte 마다 주소가 할당 돼 있다.
CPU는 Memory 주소로 Memory에 접근한다. 이 때 CPU는 address register를 사용한다.
32bit, 64bit CPU의 차이는 address register의 크기에 따라 구별한다.
- 32bit = 42억개 = 4GB
- 64bit = 1800경개 = 16EB
OS간의 최대 메모리 지원 구별은 여기서 발생한다.
정수의 저장
Unsigned
0, 양수를 표현하는 방식
22의 표현
MSB | LSB | ||||||
0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
Signed
음수, 0, 양수를 표현하는 방식
MSB가 0이면 양수, 1이면 음수로 취급. 이를 Sign Bit라고 부름.
음수는 2의 보수 방식으로 만든다.
-22의 표현
- 양수 22를 생성한다.
MSB
(Sign Bit)LSB 0 0 0 1 0 1 1 0 - 1의 보수를 취한다.
MSB
(Sign Bit)LSB 1 1 1 0 1 0 0 1 - 1을 더한다.
MSB
(Sign Bit)LSB 1 1 1 0 1 0 1 0
실수의 저장
컴퓨터는 부동소숫점을 저장 할 수 없다.
SignBit , Exponent, Fraction으로 구성
SignBit | Exponent | Fraction | |||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Exponent (지수)와 Fracton (가수)를 나누어 표현한다.
동일한 메모리 크기에서 정수에 비해 더 넓은 범위를 표현 할 수 있다.
부동소숫점 오차로 인해 100% 정확한 표현이 불가능하다. (오차가 존재한다.)
자료형
Integer type(정수)
Syntax
let name = value
let name: Int8 = value
let name: Int16 = value
let name: Int32 = value
let name: Int64 = value
Signed | Unsigned |
Int8 | UInt8 |
Int16 | UInt16 |
Int32 | UInt32 |
Int64 | UInt64 |
보통은 읿반적인 Int를 사용하는데, 정수 처리속도가 가장 빠르기 때문임.
메모리낭비가 있으나 대부분 신경쓰지 않아도 되는 정도.
Tip
Int.min
Int.max
를 사용하여 최대, 최솟값을 확인 할 수 있다.
MemoryLayout<INT>
를 사용하여 최대, 최솟값을 확인 할 수 있다.
type(of: num)
을 사용하여 데이터의 형식을 확인 할 수 있다.
Floating-point type (실수)
Syntax
let name = value
let name: Float = value
let name: Double = value
Float | Double |
4Byte | 8Byte |
정수보다 넓은 범위의 값을 저장 할 수 있지만 오차가 존재.
Float은 소숫점 6자리, Double은 15자리 까지만 정확도를 보장함.
지정하지 않으면 Double로 자동 지정.
Boolean (논리)
Syntax
let name: Boolean = value
Boolean은 조건을 판단하는 경우에 자주 사용된다. (if, while ...)
Swift
//⭕️
let isBool: Boolean = true
let isBool: Boolean = false
//❌
let isBool: Boolean = 0
let isBool: Boolean = 1
let isBool: Boolean = 30
다른 언어와 달리 true와 false만 사용 가능
C
bool isBool = true
bool isBool = false
bool isBool = 0
bool isBool = 1
bool isBool = 30
C 계열의 언어에선 0과 1 혹은 0과 0이 아닌 수를 대신해서 사용 가능.
Tip
Boolean을 저장하는 변수와 상수의 이름에는 'is'나 'has'를 접두어로 붙여 선언한다.
String (문자열)
Syntax
let name = "value"
let name: String = "value"
//⭕️
"hello"
//❌
hello
큰 따옴표을 사용해서 표현한다.
let name = "hello"
let name = "h"
let name = "1"
큰 따옴표 사이의 문자 갯수, 종류에 상관 없이 문자열로 판단한다.
Character (문자)
Syntax
let name: Character = "value"
//⭕️
let name: Character = "A"
//❌
let name: Character = "AA"
단 하나의 문자만 저장할 수 있다.
//⭕️
let cha: Character = " "
빈 문자는 '공백'으로 표현한다.
Overflow
8bit 의 Unsigned 정수 자료형은 0~255 까지의 정수를 저장 할 수 있다.
하지만 256이 저장 되는 경우.
즉, 자료형의 허용치보다 더 큰 값이 저장 되는 경우 이를 Overflow라고 한다.
C계열의 언어에선 허용하지만 Swift에서는 오류취급.
C계열에서 특성을 활용한 테크닉으로 일부러 사용하는 경우도 있지만
Swift에선 Overflow 연산자를 사용해서 구현해야 함.
형식 지정법
Type inference (형식 추론)
Syntax
let name = value
//Int
let isType = 123
//Double
let isType = 0.99
//String
let isType = "hello"
자료형을 명시하지 않았다면 초기값을 사용해 알아서 형식을 지정한다.
//❌
let istype
초기값을 사용할 수 없는 경우 형식추론 사용 불가.
이 경우엔 직접 형식을 지정 해 줘야 한다.
Type aunotation (형식 지정)
Syntax
let name: Type = value
let isType: Int
isType = 12
형식 지정을 사용하면 선언과 초기화를 분리 할 수 있다.
Identifier | Aunotation |
Int Double String |
형식 추론에서 지원하는 형식 외의 다른 형식 사용 가능 |
느림 | 빠름 |
input | Type |
123 | Int |
1.23 | Double |
"hello" | String |
true | Bool |
false | Bool |
Type Saftey (형식 안정성)
//❌
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
그냥 자료형의 이름이 다르면 무조건 호환 되지 않음.
깐깐하지만 문제를 조기 발견하기에 좋음.
Type Conversion (형변환)
Syntax
Type(value)
메모리에 저장된 값을 다른 형식으로 바꿔서 새로운 값을 생성함.
상위 자료형에서 하위 자료형으로 Conversion시 요류 취급.
Conversion에 실패하는 경우 nil 반환
Type Casting
메모리에 저장된 값을 그대로 두고, Compiler가 다르게 인식하도록 함.
똑같이 '형변환'으로 해석되긴 하지만 엄연히 다름
Type Alias
Syntax
typealias name = type
//Double
typealias aliastest = Double
let test: aliastest = 12.34
변수명에 별명을 부여
Log
2021.08.01.
블로그 이전으로 인한 글 옮김 및 수정
'학습 노트 > Swift (2021)' 카테고리의 다른 글
037 ~ 038. Loop Statements (반복문) (0) | 2021.08.06 |
---|---|
032 ~ 036. Conditional Statements (조건문) (0) | 2021.08.06 |
020 ~ 031. Operator (연산자) + 실습 (0) | 2021.08.04 |
009 ~ 011. 변수와 상수 생성하기, Scope (0) | 2021.08.01 |
001 ~ 008. 기본 용어, 특수문자 (0) | 2021.07.28 |