으니의 개발로그

[Swift] 데이터 타입(Data Type, 자료형) 본문

Swift/책 정리

[Swift] 데이터 타입(Data Type, 자료형)

아잉으니야 2021. 1. 5. 21:00

[Swift] 데이터 타입(Data Type, 자료형)

이 글은 Swift 프로그래밍 책을 읽고 요약한 내용입니다.

 

데이터 타입 : 프로그램 내에서 다뤄지는 데이터의 종류

스위프트의 기본 데이터 타입은 모두 구조체를 기반으로 구현되어 있음

데이터 타입의 이름은 첫 글자가 대문자로 시작하는 대문자 카멜케이스를 사용함

 

Int와 UInt

  • 정수 타입
  • Int : +, - 부호를 포함한 정수
  • Uint : - 부호를 포함하지 않는 0을 포함한 양의 정수
  • IntUInt 타입의 최댓값과 최솟값은 각각 max와 min 프로퍼티로 알아볼 수 있음
  • IntUInt 는 각각 8비트, 16비트, 32비트, 64비트의 형태가 있음. 즉, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64 등으로 저장할 수 있는 데이터의 크기에 따라 타입이 분리되어 있음
  • 시스템 아키텍처에 따라 IntUInt 의 타입이 달라짐. 예를 들어 32비트 아키텍처에서는 Int32Int 타입으로, UInt32UInt 타입으로 지정되고 64비트 아키텍처에는 Int64Int 타입으로, UInt64UInt 타입으로 지정 됨
var integer: Int = -100
let unsignedInteger: UInt = 50  // UInt 타입에는 음수값을 할당할 수 없음
print("integer 값: \(integer), unsignedInteger 값: \(unsignedInteger)")
/* integer 값: -100, unsignedInteger 값: 50 */

print("Int 최대값: \(Int.max), Int 최소값: \(Int.min)")
/* Int 최대값: 9223372036854775807, Int 최소값: -9223372036854775808 */
let largeInteger: Int64 = Int64.max
let smallUnsignedInteger: UInt8 = UInt8.max
print("Int64 최대값: \(largeInteger), UInt8 최대값: \(smallUnsignedInteger)")
/* Int64 최대값: 9223372036854775807, UInt8 최대값: 255 */

let tooLarge: Int = Int.max + 1 // Int 표현 범위를 초과하므로 오류를 냄
let cannotBeNagetive: UInt = -5 // UInt는 음수가 될 수 없으므로 오류를 냄

integer = unsignedInteger   // 오류! 스위프트에서 Int와 UInt는 다른 타입
integer = Int(unsignedInteger)  // Int 타입의 값으로 할당해주어야 함

 

 

Bool

  • 불리언 타입으로 참(true) 또는 거짓(false)만 값으로 가짐
var boolean: Bool = true
boolean.toggle()    // true - false 반전
print(boolean)
/* false */

let iLoveYou: Bool = true
let isTimeUnlimited: Bool = false
print("시간은 무한합니까?: \(isTimeUnlimited)")
/* 시간은 무한합니까?: false */

 

 

Character

  • 말 그대로 '문자'를 의미. 단어, 문장처럼 문자의 집합이 아닌 단 하나의 문자를 의미함

  • 스위프트는 유니코드 9 문자를 사용하므로 영어는 물론, 유니코드에서 지원하는 모든 언어 및 특수기호 등을 사용할 수 있음

    • 스위프트 코드를 작성할 때도 유니코드 문자를 모두 사용할 수 있음. ex) let 이름: String = "jieun"
  • 문자를 표현하기 위해서는 값의 앞 뒤에 큰따옴표를 사용하여 표현

let alphabetA: Character = "A"
print(alphabetA)
/* A */

// Character 값에 유니코드 문자를 사용할 수 있음
let commandCharacter: Character = "♡"
print(commandCharacter)
/* ♡ */

// 한글도 유니코드 문자에 속하므로 스위프트 코드의 변수 이름으로 사용할 수 있음
let 한글변수이름: Character = "ㄱ"
print("한글의 첫 자음: \(한글변수이름)")
/* 한글의 첫 자음: ㄱ */

 

 

String

  • 문자의 나열, 즉 문자열
  • StringCharacter 와 마찬가지로 유니코드 9를 사용할 수 있음
  • 값의 앞뒤에 큰따옴표를 사용하여 표현
// 상수로 선언된 문자열을 변경이 불가능함
let name: String = "seonho"

// 이니셜라이저를 사용하여 빈 문자열을 생성할 수 있음
// var 키워드를 사용하여 변수를 생성했으므로 문자열의 수정 및 변경이 가능
var introduce: String = String()

// append() 메서드를 사용하여 문자열을 이어붙일 수 있음
introduce.append("제 이름은")

// + 연산자를 통해서도 문자열을 이어붙일 수 있음
introduce = introduce + " " + name + "입니다."
print(introduce)
/* 제 이름은 seonho입니다. */

// name에 해당하는 문자의 수를 셀 수 있음
print("name의 글자 수: \(name.count)")
/* name의 글자 수: 6 */
// 빈 문자열인지 확인해볼 수 있음
print("introduce가 비어있습니까?: \(introduce.isEmpty)")
/* introduce가 비어있습니까?: false */

// 유니코드의 스칼라값을 사용하면 값에 해당하는 표현이 출력됨
let unicodeScalarValue: String = "\u{2665}"
print(unicodeScalarValue)
/* ♥ */

 

특수문자

특수문자 설명
\n 줄바꿈 문자
\\ 문자열 내에서 백슬래시를 표현하고자 할 때 사용
\" 문자열 내에서 큰따옴표를 표현하고자 할 때 사용
\t 탭 문자. 키보드의 탭 키를 눌렀을 때와 같은 효과
\0 문자열이 끝났음을 알리는 null 문자

 

print("문자열 내부에\n 이런 \"특수문자\"를 \t사용하면 \\이런 놀라운 결과를 볼 수 있습니다")
/*
 문자열 내부에
  이런 "특수문자"를     사용하면 \이런 놀라운 결과를 볼 수 있습니다
 */
print(#"문자열 내부에서 특수문자를 사용하기 싫다면 문자열 앞, 뒤에 #을 붙여주세요 그러면 \n \t 등이 그대로 출력됩니다"#)
/* 문자열 내부에서 특수문자를 사용하기 싫다면 문자열 앞, 뒤에 #을 붙여주세요 그러면 \n \t 등이 그대로 출력됩니다 */
let number: Int = 100
print(#"특수문자를 사용하지 않을 때도 문자열 보간법을 사용하고 싶다면 이렇게 \#(number) 해보세요 #을 넣지 않으면 \(number) 그대로 출력됩니다"#)
/* 특수문자를 사용하지 않을 때도 문자열 보간법을 사용하고 싶다면 이렇게 100 해보세요 #을 넣지 않으면 \(number) 그대로 출력됩니다 */

 

 

Any, AnyObject와 nil

  • Any : 스위프트의 모든 데이터 타입을 사용할 수 있다는 뜻
  • AnyObject : Any 보다는 조금 한정된 의미로 클래스와 인스턴스만 할당할 수 있음
var someVar: Any = "seonho" // Any로 선언된 변수에는 문자열도
someVar = 50    // 정수도
someVar = 100.1 // 실수, 또는 어떤 타입의 값이라도 할당할 수 있음

 

  • nil : '없음'을 나타내는 스위프트의 키워드. 즉, 변수 또는 상수에 값이 들어있지 않고 비어있음을 나타내는 데 사용
  • nil 이면 해당 변수 또는 상수에 접근했을 때 잘못된 메모리 접근(memory access)으로 런타임 오류가 발생