데이터 타입은 프로그램 내에서 다뤄지는 데이터의 종류를 뜻한다.
스위프트의 기본 데이터 타입은 구조체를 타입의 기반으로 삼아 스위프트의 다양한 기능(익스텐션, 제네릭 등)을 두루 사용하여 구현되어 있다. 여기서 핵심적인 것은 스위프트의 기본 데이터 타입이 모두 구조체 기반 이라는 것이다.
스위프트의 모든 데이터 타입은 대문자 카멜케이스를 사용한다.
Int와 UInt는 정수 타입을 나타낸다.
Int의 경우 +,- 부호를 포함한 정수를 뜻하며 이 중 - 부호를 포함하지 않고 0을 포함한 양의 정수는 UInt로 표현한다. 이들은 각각 8, 16, 32, 64비트의 형태가 존재하며 시스템 아키텍처에 따라 타입이 달라진다.
var integer : Int = -100
let unsignedInteger : UInt = 50 // UInt 타입에는 음수값을 할당할 수 없다.
print("integer 값 : \(integer), unsignedInteger 값 : \(unsignedInteger)")
// integer 값 : -100, unsignedInteger 값 : 50
print("Int의 최댓값: \(Int.max), 최솟값: \(Int.min)")
// Int의 최댓값: 9223372036854775807, 최솟값: -9223372036854775808
print("UInt의 최댓값: \(UInt.max), 최솟값: \(UInt.min)")
// UInt의 최댓값: 18446744073709551615, 최솟값: 0
let largerInteger : Int64 = Int64.max
let smallUnsinedInteger : UInt8 = UInt8.max
print("Int64의 최댓값 : \(largerInteger), UInt8의 최댓값: \(smallUnsinedInteger)")
// Int64의 최댓값 : 9223372036854775807, UInt8의 최댓값: 255
//let tooLarge : Int = Int.max + 1 // 표현 범위를 초과하므로 오류
//let cannotbeNative : UInt = -1 // UInt는 음수값을 가질 수 없으므로 오류
//integer = unsignedInteger // Int와 UInt는 비슷하지만 엄연히 다른 타입!
integer = Int(unsignedInteger) // 형변환을 해줄 수 있다.
정수표현은 다음과 값이 진수 별로 표현할 수 있다.
let decimalInteger : Int = 28
let binaryInteger : Int = 0b11100
let octalInteger : Int = 0o34
let hexadecimalInteger : Int = 0x1C
print("\(decimalInteger), \(binaryInteger), \(octalInteger), \(hexadecimalInteger)")
// 28, 28, 28, 28
Bool은 불리언 타입이다. 참(true) 또는 거짓(false)만 값을 가진다.
var boolean : Bool = true
boolean.toggle() // true - false 반전
let iLoveYou : Bool = true
let isTimeUnlimited : Bool = false
print("boolean의 값 : \(boolean)")
// boolean의 값 : false
print("iLoveYou의 값 : \(iLoveYou)")
// iLoveYou의 값 : true
print("isTimeUnlimited의 값 : \(isTimeUnlimited)")
// isTimeUnlimited의 값 : false
Float와 Double은 부동소수점을 사용하는 실수며 부동소수 타입이라고한다.
부동소수 타입은 정수 타입보다 훨씬 넓은 범위의 수를 표현할 수 있다.
Double의 경우 64비트의 부동소수를 표현하며, Float의 경우 32비트의 부동소수를 표현한다.
64비트 환경에서 Double은 최소 15자리의 십진수를 표현할 수 있다. 반면에 Float의 경우 6자리의 숫자까지만 표현이 가능하다.
// Float이 수용할 수 있는 범위를 넘어섭니다.
// Float이 표현할 수 있는 범위까지만 표현합니다.
var floatValue : Float = 1234567890.1
// 같은 수지만 Double은 수용가능합니다.
var doubleValue : Double = 1234567890.1
print("floatValue : \(floatValue)")
// floatValue : 1.234568e+09
print("doubleValue : \(doubleValue)")
// doubleValue : 1234567890.1
// Float이 수용할 수 있는 범위로 변경해줍니다.
floatValue = 123456.1
print(floatValue)
// 123456.1
Tip : 임의의 수 만들기
스위프트 4.2 버전부터 임의의 수를 만드는 random(int:) 메서드를 사용할 수 있다.
Int.random(int: -100, 100)
UInt = UInt.random(in: 0...30)
Float = Float.random(in: 1.5...4.3)
Double = Double.random(in: -0.5...1.5)
character는 말 그대로 '문저'를 의미한다.
단어, 문장처럼 문자의 집합이 아닌 단 하나의 문자를 의미하며 스위프트에서는 유니코드 9 문자를 사용하므로 영어는 물론, 유니코드에서 지원하는 모든 언어 및 특수기호 등을 사용할 수 있다. 문자를 표현하기 위해서는 값의 앞뒤에 큰따옴표를 사용하여 표현한다.
let alphabetA : Character = "A"
print(alphabetA)
// A
// character 값에는 유니코드 문자를 사용할 수 있다.
let commandCharacter : Character = "❤️"
print(commandCharacter)
// ❤️
// 한글도 유니코드 문자에 속하므로 변수이르으로 사용가능하다.
let 한글변수이름 : Character = "ㄱ"
print("한글의 첫번째 자음 : \(한글변수이름)")
// ㄱ
String은 문자의 나열, 즉 문자열이다.
String은 Character와 마찬가지로 유니코드 9를 사용할 수 있으며, 값의 앞뒤에 큰따옴표를 사용하여 표현한다
let name : String = "nick"
// 이니셜라이저를 사용한 빈 문자열 생성
var introduce : String = String() // var 키워드를 사용했기 때문에 수정 가능
// appand()
introduce.append("제 이름은")
// + 연산자를 통한 이어붙이기
introduce = introduce + " " + name + "입니다."
print(introduce)
// 제 이름은 nick입니다.
// count를 통해 문자열의 수를 확인할 수 있다.
print("name의 문자열 수 : \(name.count)")
// isEmpty를 통해 빈 문자열인지 확인 가능
print("introduce가 빈 문자열인가요? \(introduce.isEmpty)")
let something : String = "somethigWord"
print(something.hasPrefix("some")) // true
print(something.hasPrefix("eth")) // false
print(something.hasSuffix("Word")) // true
print(something.hasPrefix("word")) // false
let hello : String = "Hello"
print(hello.uppercased()) // HELLO
print(hello.lowercased()) // hello
Tip : 코드상에서 여러 줄의 문자열을 직접쓰고 싶을 때
큰따옴표 세 개를 사용한다.let word : String = """ this is swift """
Any는 스위프트의 모든 데이터 타입을 사용할 수 있다는 뜻이다.
변수 또는 상수의 데이터 타입이 Any로 지정되어 있다면 그 변수 또는 상수에는 모든 타입이 할당 가능하다.
var anyVar : Any = "String"
anyVar = 50 // 아무 타입이나 할당 가능하기 때문에 오류 없음.
anyVar = 1.23 // 아무 타입이나 할당 가능하기 때문에 오류 없음.
Any 보다는 조금 한정된 의미로 클래스의 인스턴스만 할당 가능하다.
'없음'을 나타내는 스위프트의 키워드
변수 또는 상수에 값이 들어있지 않고 비어있음을 나타내는 데 사용한다.
다른 언어, 특히 C++, Java, Python에서 사용되는 Null 키워드와 동일하다고 보면된다.
Any와 AnyObject는 될 수 있으면 사용하지 안흔 편이 좋다. 타입에 엄격한 스위프트의 특성상 Any 또는 AnyObject로 선언된 변수의 값을 가져다 쓰려면 매번 타입 확인 및 변환을 해줘야 하는 불편함이 있을뿐더러 예기치 못한 오류의 위험을 증가시키기 때문이다. 될 수 있으면 항상 타입을 명시하는 것이 좋다.