몸이 크다면 큰 사이즈, 작다면 작은 사이즈를 입을 것이다. 코드를 통해 처리하는 데이터도 마찬가지다. 큰 데이터는 큰 메모리에, 작은 데이터는 작은 메모리에 저장한다.
메모리의 값보다 큰 값을 저장할 때, object-C나 C계열에서는 Overflow를 허용하는데 Swift에서는 오류로 판단.
+123 // '+' 생략가능
-123 // '-' 표기
1.23 // 실수
1.23e4 // 엄청 큰 숫자는 지수로 표현, 10진수 실수
0xAp2 // 16진수 실수
// 엄청 큰 수를 사용하는 게 아니라면 주로 사용은 하지 않음
1_000_000 // 1,000,000 금액을 표시할 때 언더스코어바로 구분가능
10 // 10진수
0b1010 // 2진수 (10진수의 10)
0o12 // 8진수 (10진수의 10)
0xA // 16진수 (10진수의 10)
Int 자료형의 크기 범위 |
---|
Int8 : 1byte |
Int16 : 2byte |
Int32 : 4byte |
Int64 : 8byte |
Int8.min // -128
Int8.max // 127
Int16.min // -32768
Int16.max // 32767
MemoryLayout<Int8>.size // 1byte - 메모리 공간의 크기
MemoryLayout<Int16>.size // 2byte
Int8.max // 127
Int8.min // -128
UInt8.max // 255
UInt8.min // 0
MemoryLayout<Int>.size // 8byte
Int.min // -9223372036854775808
Int.max // 9223372036854775807
let num = 123 // 지정하지 않으면 기본적으로 Int로 저장됨.
type(of: num)
// 원주율 3.141592653589793238462643383279502884197169
let pie: Float = 3.141592653589793238462643383279502884197169
print(pie)
let pie2 = 3.141592653589793238462643383279502884197169
// 자료형을 직접 지정하지 않으면 모든 실수는 Double로 저장됨.
print(pie) // 3.1415927
print(pie2) // 3.141592653589793
참과 거짓을 다루는 Boolean
let isValid = true
let isValid2: Bool = false // false 대신 '0'사용 불가능
let str = ""
str.isEmpty
if isValid {
}
while !isValid {
}
하나의 자료를 구성하기 위하여 일련의 문자들의 집합으로 구성된 정보
// 문자열 x Have a nice day
"Have a nice day" // 큰따옴표로 감싸면 문자열
"123" // 큰따옴표 사이에 포함되어 있기 때문에 문자열
"1" // 큰따옴표 사이에 포함되어 있기 때문에 문자열, Swift는 문자열 사이의 문자 수를 상관하지 않는다.
let str = "1"
type(of: str) // String.Type
하나의 자료를 구성하기 위하여 단 하나의 문자로 구성된 정보
// 하나의 문자로 처리하고 싶다면 Character
let ch: Character = "1"
type(of: ch) // Character.Type
let doubleCh: Character = "AA", 2개이상의 문자를 문자로 저장할 수 없다.
let empthCh: Character = "" // error
let empthCh: Character = " " // Character에 빈문자를 저장하고 싶다면 공백문자로 저장
// Bool
var someBool: Bool = true
someBool = false
// Int
var someInt: Int = -100
// UInt
var someUint: UInt = 100
// someUint = someInt // error
// Float
var someFloat: Float = 3.14
someFloat = 3
// Double
var someDouble: Double = 3.14
someDouble = 3
// someDouble = someFloat // error
// Character
var someCharacter: Character = "@"
// someCharacter = "@@@" // error
// String
var someString: String = "!@#$%^"
someString = someString + "12345"
print(someString) // !@#$%^12345
자료형을 명시적으로 선언하지 않았다면 초기값을 통해서 알아서 결정
let num = 123
type(of: num) // Int.Type
// Type Inference (형식추론) - 자료형을 명시적으로 선언하지 않았다면 초기값을 통해서 알아서 결정.
let temp = 11.2
type(of: temp) // Double.Type
let str = "Switf"
type(of: str) // String.Type
let a = true
let b = false
type(of: a) // Bool.Type
type(of: b) // Bool.Type
let value /* error - Type annotation missing in pattern
초기값이 없어 자료형 추론 불가능
*/
123 → Int
1.23 → Double
"Hello" → String
true → Bool
false → Bool
변수나 상수를 선언할 때 자료형을 표기해주는 문법
let name: Type = value
var name: Type = value
let num: Int = 123
let value: Double // 선언만 하고
value = 12.3 // 여기서 초기화
/*
자료형을 직접 지정하지 않으면 Type Inference를 통해 Int, Double, String으로 지정된다. 다른 자료형으로 지정하고 싶다면 반드시 Type Annotation을 사용한다.
*/
let ch: Character = "c"
/*
Type Inference은 초기값을 기반으로 형식을 추론하기 때문에 compile 시간이 증가한다. 프로젝트 규모가 클수록 compile 시간은 더 증가하고, compile 시간을 단축시키기 위해서 Type Annotation 활용하는 경우도 있다.
*/
서로 다른 자료형은 호환할 수 없다.
let str: String = 123
let num: Int = 12.34
/*
문자열에 정수 저장 불가능
값의 성격이 다르기때문에 호환불가능
*/
let a = 7
let b: Int8 = a
/*
a,b 둘다 정수를 저장하는 자료형이지만 메모리의 값이 달라 호환 불가능
*/
let a = 7
let b: Int64 = a
/*
메모리의 값이 갖더라도 자료형의 이름이 다르다면 호환 불가능
*/
let a = 12 // Int
let b = 34.56 // Double
//let result = a + b // error
/*
Binary operator '+' cannot be applied to operands of type 'Int' and 'Double'
계산식의 포함된 모든 숫자의 자료형을 일치시켜야 계산시킬 수 있다.
*/
let rate = 1.94 // Double
let amt = 10_000_000 // Int
//let result = rate * amt // error
let result = rate * Double(amt) // 19400000
Int(rate * Double(amt)) // 19400000
Int(rate) * amt // 10000000
Type Conversion (형변환) vs Type Casting (형변환)
둘 다 형변환이라고 번역되는 경우가 있다.
let a = 123
let b = 4.56
Double(a) + b // 123.0 + 4.56
a + Int(b) // 123 + 4
// Type Conversion
let c = Int8(a)
let d = Int.max
let e = Int8(d) // 큰 error 발생
/*
error: Execution was interrupted, reason: ~
큰 자료형에서 작은 자료형으로 변환할 때는 조심해야 한다.
*/
let str = "123"
let num = Int(str) // 123
let str2 = "number"
let num2 = Int(str) // nil
기본 자료형에 새로운 이름을 추가하는 문법
typealias NewName = TypeName
typealias PinkPatrick = Double
// 별명을 만든다고 생각하면 좋다. 새로운 자료형 X
let lat: PinkPatrick = 12.34
let lon: PinkPatrick = 56.78
/*
let lat: Double = 12.34
let lon: Double = 56.78
typealias는 자주 사용되진 않지만, 활용코드에 따라서는 가독성이 높아질 수 있다.
/*