[Swift] Data Types(자료형), Boolean, Numbers(숫자), Characters(문자), Strings(문자열)

Kio·2021년 11월 18일
0

Swift

목록 보기
4/14
post-thumbnail

Data Types with Memory 자료형

몸이 크다면 큰 사이즈, 작다면 작은 사이즈를 입을 것이다. 코드를 통해 처리하는 데이터도 마찬가지다. 큰 데이터는 큰 메모리에, 작은 데이터는 작은 메모리에 저장한다.

Data Types (데이터 형식)

  • Bulit-in Data Type vs Custom Data Type(Class, Struct)
  • Integer Types
  • Floating-point Types
  • Boolean Types
  • Character Types
  • String Types

Memory (메모리)

  • 컴퓨터 메모리에는 1과 0으로 저장된다.
    • 1 Bit :: 4개
      • ex) 1 0
    • 1 Byte :: 256개
      • ex) 1 0 0 1 0 0 1 0 (-128~127 or 0~255)
  • 2는 저장할 수 없다. 항상 2진수로 바꿔서 저장해야 한다.
  • Sign Bit (사인 비트)
    • 0(최상의 bit, Sign Bit) = Positive Number(양수)
    • 1(최상의 bit, Sign Bit) = Negative Number(음수)
  • 2의 보수 (2's Complement)
    • 22 > 00010110(2진수) Bitwise Not > 11101001 + 1 > 11101010
  • 1110(Exponent) / 1010(Fraction)
    1. 실수를 저장할 때는 지수와 가수를 나눠서 저장
    2. 동일한 메모리 크기에서 정수에 비해 더 넓은 범위를 표현가능
    3. 부동 소수점 오차로 인해서 100% 정확한 실수를 저장할 수 없다.

Overflow

메모리의 값보다 큰 값을 저장할 때, object-C나 C계열에서는 Overflow를 허용하는데 Swift에서는 오류로 판단.



Numbers

Number Literals (숫자 리터럴)

+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)

Integer Types

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

Signed vs Unsigned

  • 정수자료형
  • | Signed
    (양수, 0, 음수) | Unsigned
    (양수, 0, 음수저장X) |
    | :-: | :-: |
    | Int8 | UInt8 |
    | Int16 | UInt16 |
    | Int32 | UInt32 |
    | Int64 | UInt64 |
Int8.max // 127
Int8.min // -128

UInt8.max // 255
UInt8.min // 0

Int & UInt

MemoryLayout<Int>.size // 8byte
Int.min // -9223372036854775808
Int.max // 9223372036854775807

let num = 123 // 지정하지 않으면 기본적으로 Int로 저장됨.
type(of: num)

Floating-point Types

  • 실수 자료형
  • 정수 자료형보다 항상 큰 값을 저장할 수 있다.
    • Int64보다 1/2의 메모리값을 가진 Float이더라도 지수와 가수로 나눠서 저장하기 때문에 더 많은 값을 저장할 수 있다.
  • Floating-point Types은 메모리에 따라 소수점의 정확성이 달라진다.
    • Float는 소수점 최대 6자리까지 정확성을 보장
    • Double은 소수점 최대 15자리까지 정확성을 보장
// 원주율 3.141592653589793238462643383279502884197169

let pie: Float = 3.141592653589793238462643383279502884197169
print(pie)
let pie2 = 3.141592653589793238462643383279502884197169
// 자료형을 직접 지정하지 않으면 모든 실수는 Double로 저장됨.

print(pie)  // 3.1415927
print(pie2) // 3.141592653589793


Boolean

참과 거짓을 다루는 Boolean

  • 모든 문자를 소문자로 표기
  • true와 false로만 사용하며, false 대신 '0' 사용 불가능
let isValid = true
let isValid2: Bool = false // false 대신 '0'사용 불가능

let str = ""
str.isEmpty

if isValid {

}

while !isValid {

}


Strings and Characters (문자열과 문자)

Strings 문자열

하나의 자료를 구성하기 위하여 일련의 문자들의 집합으로 구성된 정보

// 문자열 x Have a nice day
"Have a nice day" // 큰따옴표로 감싸면 문자열
"123" // 큰따옴표 사이에 포함되어 있기 때문에 문자열
"1" // 큰따옴표 사이에 포함되어 있기 때문에 문자열, Swift는 문자열 사이의 문자 수를 상관하지 않는다.

let str = "1"
type(of: str) // String.Type

Characters 문자

하나의 자료를 구성하기 위하여 단 하나의 문자로 구성된 정보

// 하나의 문자로 처리하고 싶다면 Character

let ch: Character = "1"
type(of: ch) // Character.Type

let doubleCh: Character = "AA", 2개이상의 문자를 문자로 저장할 수 없다.

let empthCh: Character = "" // error
let empthCh: Character = " " // Character에 빈문자를 저장하고 싶다면 공백문자로 저장


Bool, Int, UInt, Float, Double, Charcter, String 비교

// 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


Type Inference (형식 추론)

자료형을 명시적으로 선언하지 않았다면 초기값을 통해서 알아서 결정

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
초기값이 없어 자료형 추론 불가능
*/

Type Inference Rules

123Int
1.23Double
"Hello"String
trueBool
falseBool

Type Annotation (형식 주석)

변수나 상수를 선언할 때 자료형을 표기해주는 문법

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 활용하는 경우도 있다.
 */

Type Safety (형식 안전성)

서로 다른 자료형은 호환할 수 없다.

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 (형 변환)

Type Conversion (형변환) vs Type Casting (형변환)

둘 다 형변환이라고 번역되는 경우가 있다.

  • Type Conversion : 메모리에 저장된 값을 다른 형식으로 바꾸어 새로운 값을 생성
  • 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

Type Alias (타입 알리아스)

기본 자료형에 새로운 이름을 추가하는 문법

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는 자주 사용되진 않지만, 활용코드에 따라서는 가독성이 높아질 수 있다.
/*
profile
Someday_iOS_Dev

0개의 댓글