데이터 타입은 프로그램 내에서 다뤄지는 데이터의 종류를 뜻한다. 스위프트의 기본 데이터 타입은 구조체를 타입의 기반으로 삼아 스위프트의 다양한 기능을 두루 사용하여 구현되어 있다.
스위프트의 모든 데이터 타입 이름은 첫 글자가 대문자로 시작하는 대문자 카멜케이스를 사용한다.
3.1 Int와 UInt
정수 타입이다. Int는 +, - 부호를 포함한 정수를 뜻하며 이 중 -부호를 포함하지 않는 0을 포함한 양의 정수는 UInt로 표현한다. 최댓값과 최솟값은 각각 max와 min 프로퍼티로 알아볼 수 있다. 각각 8비트, 16비트, 32비트, 64비트의 형태가 있다. Int8, Int16, ...... UInt8, UInt16, ....등으로 저장할 수 있는 데이터의 크기에 따라 타입이 분리되어 있다. 시스템 아키텍처에 따라 Int와 UInt의 타입이 달라진다.
스위프트는 데이터 타입에 굉장히 엄격하므로 같은 정수라 하더라도 Int와 UInt를 완전히 다른 타입으로 인식한다.
다음은 각 진수에 따라 정수를 표현하는 방법이다.
- 10진수: 우리가 평소에 쓰던 숫자와 동일하게 작성하면 된다.
- 2진수: 접두어 0b를 사용하여 표현
- 8진수: 접두어 0o를 사용하여 표현
- 16진수: 접두어 0x를 사용하여 표현
3.2 Bool
불리언 타입이다. 참(true) 또는 거짓(false)만 값으로 갖는다.
/*
코드 3-3. Bool
*/
var boolean: Bool = true
boolean.toggle() // true - false로 변경
let iLoveYou: Bool = true
let isTimeUnlimited: Bool = false
print("시간은 무한합니까? : \(isTimeUnlimited)")
3.3 Float과 Double
부동소수점을 사용하는 실수며 부동소수 타입이라고 한다. 흔히 말하는 소수점 자리가 있는 수이다. 정수 타입보다 훨씬 넓은 범위의 수를 표현할 수 있다. 스위프트에는 64비트의 부동소수 표현을 하는 Double과 32비트의 부동 소수 표현을 하는 Float이 있다.
64비트 환경에서 Double은 최소 15자리의 십진수를 표현할 수 있는 반면에 Float은 6자리의 숫자 까지만 표현이 가능하다. 일반적인 상황에서는 Double의 사용을 권한다.
/*
코드 3-4. Float과 Double
*/
// Float이 수용할 수 있는 범위를 넘어선다.
// 자신이 감당할 수 있는 만큼만 남기므로 정확도가 떨어진다.
var floatValue: Float = 1234567890.1
// Double은 충분히 수용할 수 있다.
let doubleValue: Double = 1234567890.1
print("floatValue: \(floatValue), doubleValue: \(doubleValue)")
// Float이 수용할 수 있는 범위의 수로 변경한다.
floatValue = 123456.1
print(floatValue)
3.4 Character
말 그대로 '문자'를 의미한다. 단어, 문장처럼 문자의 집합이 아닌 단 하나의 문자를 의미한다. 문자를 표현하기 위해서는 값의 앞뒤에 큰따옴표를 사용하여 표현한다.
3.5 String
문자의 나열, 즉 문자열이다. String은 Character와 마찬가지로 유니코드 9를 사용할 수 있으며, 값의 앞뒤에 큰따옴표를 사용하여 표현한다.
/*
코드 3-6. String
*/
// 상수로 선언된 문자열은 변경이 불가능하다.
let name: String = "choi"
// 이니셜라이저를 사용하여 빈 문자열을 생성할 수 있다.
// var 키워드를 사용하여 변수를 생성했으므로 문자열의 수정 및 변경이 가능하다.
var introduce: String = String()
// append() 메서드를 사용하여 문자열을 이어붙일 수 있다.
introduce.append("제 이름은")
// + 연산자를 통해서도 문자열을 이어붙일 수 있다.
introduce = introduce + " " + name + "입니다."
print(introduce)
// name에 해당하는 문자의 수를 셀 수 있다.
print("name의 글자 수 : \(name.count)")
// 빈 문자열인지 확인해볼 수 있다.
print("introduce가 비어있습니까? : \(introduce.isEmpty)")
// 유니코드의 스칼라값을 사용하면 값에 해당하는 표현이 출력된다.
let unicodeScalarValue: String = "\u{2665}"
String 타입에는 기본적으로 많은 메서드와 프로퍼티들이 구현되어 있으며, 문자열과 관련된 연산자도 많이 정의되어 있기 때문에 문자열을 조금이나마 다루기 쉽게 지원해준다.
/*
코드 3-7. String 타입의 다양한 기능
*/
// 연산자를 통한 문자열 결합
let hello: String = "Hello"
let yagom: String = "yagom"
var greeting: String = hello + " " + yagom + "!"
print(greeting) // Hello yagom!
greeting = hello
greeting += " "
greeting += yagom
greeting += "!"
print(greeting) // Hello yagom!
// 연산자를 통한 문자열 비교
var isSameString: Bool = false
isSameString = hello == "Hello"
print(isSameString) // true
isSameString = hello == "hello"
print(isSameString) // false
// 메서드를 통한 접두어, 접미어 확인
var hasPrefix: Bool = false
hasPrefix = hello.hasPrefix("He")
print(hasPrefix) // true
hasPrefix = hello.hasPrefix("HE")
print(hasPrefix) // false
var hasSuffix: Bool = false
hasSuffix = hello.hasSuffix("He")
print(hasSuffix) // false
hasSuffix = hello.hasSuffix("llo")
print(hasSuffix) // true
// 메서드를 통한 대소문자 변환
var convertedString: String = ""
convertedString = hello.uppercased()
print(convertedString) // HELLO
convertedString = hello.lowercased()
print(convertedString) // hello
// 프로퍼티를 통한 빈 문자열 확인
var isEmptyString: Bool = false
isEmptyString = greeting.isEmpty
print(isEmptyString) // false
greeting = ""
isEmptyString = greeting.isEmpty
print(isEmptyString) // true
// 프로퍼티를 이용해 문자열 길이 확인
print(greeting.count) // 0
greeting = "안녕하세요"
print(greeting.count) // 5
// 코드상에서 여러 줄의 문자열을 직접 쓰고 싶다면 큰따옴표 세 개를 사용하면 된다.
// 큰따옴표 세 개를 써주고 한 줄을 내려써야 한다.
// 마지막 줄도 큰따옴표 세 개는 한 줄 내려써야 한다.
greeting = """
안녕하세요.
반갑습니다.
"""
3.5.1 특수문자
문자열 내에서 일정 기능을 하는 특수문자(제어문자라고도 함)가 있다. 백슬래시에 특정한 문자를 조합하여 사용한다. 다음 표는 가장 많이 쓰는 특수문자이다.
특수문자 | 설명 |
---|---|
\n | 줄바꿈 문자 |
\\ | 문자열 내에서 백슬래시를 표현하고자 할 때 사용 |
\" | 문자열 내에서 큰따옴표를 표현하고자 할 때 사용 |
\t | 탭 문자. 키보드의 탭 키를 눌렀을 때와 같은 효과 |
\0 | 문자열이 끝났음을 알리는 null 문자 |
3.6 Any, AnyObject와 nil
Any는 스위프트의 모든 데이터 타입을 사용할 수 있다는 뜻이다. 변수 또는 상수의 데이터 타입이 Any로 지정되어 있다면 그 변수 또는 상수에는 어떤 종류의 데이터 타입이든지 상관없이 할당할 수 있다.
AnyObject는 Any보다는 조금 한정된 의미로 클래스의 인스턴스만 할당할 수 있다.
NOTE_ Any와 AnyObject는 될 수 있으면 사용하지 않는 편이 좋다. 타입에 엄격한 스위프트의 특성상 Any 또는 AnyObject로 선언된 변수의 값을 가져다 쓰려면 매번 타입 확인 및 변환을 해줘야 하는 불편함이 있을뿐더러 예기치 못한 오류의 위험을 증가시키기 때문이다.
nil은 특정 타입이 아니라 '없음'을 나타내는 스위프트의 키워드이다. 즉, 변수 또는 상수에 값이 들어있지 않고 비어있음을 나타내는 데 사용한다. 변수 또는 상수에 값이 없는 경우, 즉 nil이면 해당 변수 또는 상수에 접근했을 때 잘못된 메모리 접근으로 런타임 오류가 발생한다.
또 데이터 타입 기본에서 설명하지 않았지만 특정 함수의 반환 타입으로 사용될 수 있는 Never라는 타입이 있다. Never에 대해서는 종료되지 않는 함수(7장)에서 소개한다.
'iOS > SWIFT' 카테고리의 다른 글
[Swift] Chapter 06. 흐름 제어 (0) | 2021.10.08 |
---|---|
[Swift] Chapter 05. 연산자 (0) | 2021.10.08 |
[Swift] Chapter 04. 데이터 타입 고급 (0) | 2021.10.08 |
[Swift] Chapter 02. 스위프트 처음 시작하기 (0) | 2021.10.08 |
[Swift] Chapter 01. 스위프트 (0) | 2021.10.08 |
댓글