본문 바로가기
iOS/SWIFT

[Swift] Chapter 03. 데이터 타입 기본

by 원만사 2021. 10. 8.
반응형

데이터 타입은 프로그램 내에서 다뤄지는 데이터의 종류를 뜻한다. 스위프트의 기본 데이터 타입은 구조체를 타입의 기반으로 삼아 스위프트의 다양한 기능을 두루 사용하여 구현되어 있다.

스위프트의 모든 데이터 타입 이름은 첫 글자가 대문자로 시작하는 대문자 카멜케이스를 사용한다.

 

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장)에서 소개한다.

 

 

 

스위프트 프로그래밍: Swift 5 - 교보문고

객체지향, 함수형, 프로토콜 지향 패러다임까지 한 번에! | 스위프트를 제대로 이해하고 싶은 개발자를 위한 책스위프트는 iOS와 macOS용 애플리케이션 개발에 주로 사용하는 프로그래밍 언어입니

www.kyobobook.co.kr

 

반응형

댓글