[swift 기초] 데이터 타입(1)

silverCastle·2021년 8월 8일
1
post-thumbnail

💡기본적인 데이터 타입

swift의 기본 데이터 타입이 모두 구조체를 기반으로 구현되어 있다.

앞에서 언급했다시피 우리가 흔히 알고 있는 C언어와는 다르게 swift에서의 모든 데이터 타입 이름은 첫 글자가 대문자로 시작하는 대문자 카멜케이스를 사용한다.

✍️ Int와 UInt

Int는 +, - 부호를 포함한 정수를 뜻하며 UInt는 - 부호를 포함하지 않는 0을 포함한 양의 정수를 뜻한다.

var integer: Int = -1
var unsignedInteger: UInt = 1
print("integer: \(integer), unsignedInteger: \(unsignedInteger)")
// 자료형의 최댓값과 최솟값을 알고싶다면 max, min 프로퍼티를 이용하자.
print("Int 최댓값: \(Int.max), Int 최솟값: \(Int.min)")
print("UInt 최댓값: \(UInt.max), UInt 최솟값: \(UInt.min)")

결과

integer: -1, unsignedInteger: 1
Int 최댓값: 9223372036854775807, Int 최솟값: -9223372036854775808
UInt 최댓값: 18446744073709551615, UInt 최솟값: 0

만약, 0을 포함한 양의 정수를 뜻하는 UInt로 선언한 변수에 음의 정수를 할당하게 된다면 어떻게 될까?
당연하듯이, 오류를 내뱉게 된다.

var unsignedInteger: UInt = -1

결과

Negative integer '-1' overflows when stored into unsigned type 'UInt'

진수에 따라 정수를 표현하고 싶다면?

  • 10진수: 우리가 평소에 쓰던 것처럼 동일하게 작성
  • 2진수: 접두어 0b를 사용
  • 8진수: 접두어 0o를 사용
  • 16진수: 접두어 0x를 사용

✍️ Bool

참(true) 또는 거짓(false)만 값으로 가진다. 어떠한 문제를 해결하면서 참과 거짓으로 구분하고 싶을 때 유용하다.

var boolean: Bool = false
print("당신은 개발자입니까? \(boolean)")
// 값을 반전하고 싶을 경우 toggle() 함수를 사용하자.
boolean.toggle()
print("당신은 개발자입니까? \(boolean)")

결과

당신은 개발자입니까? false
당신은 개발자입니까? true

✍️ Float과 Double

부동소수점, 즉 흔히 우리가 말하는 소수점 자리가 있는 수이다. 이 둘의 차이는 64비트 환경에서 Float은 6자리의 숫자까지만 표현이 가능하고 Double은 최소 15자리의 숫자를 표현할 수 있다는 것이다.
만약, Float에 할당되는 값이 6자리를 넘어가면 어떻게 될까?
Float이 감당할 수 있는 만큼만 남기므로 정확도가 떨어지게 된다.

var floatValue: Float = 12345678.1
print("floatValue: \(floatValue)")

결과

floatValue: 12345678.0

✍️ Character

말 그대로 단어, 문장처럼 문자의 집합이 아닌 단 하나의 문자만을 의미한다.

// 알파벳 'A'는 불변하는 값이므로 var가 아니라 let을 사용하여 가독성을 높이자.
let alphabetA: Character = "A"
print(alphabetA)

// 유니코드 문자를 사용하여 값을 할당할 수 있다.
let heart: Character = "🥰"
print(heart)

결과

A
🥰

✍️ String

말 그대로 문자의 나열, 즉 문자열이다. C언어를 경험해본 적이 있다면 문자열을 표현하는 게 까다롭다는 것을 알고 있을 것이다.
하지만 그런 까다로움은 잊어라.
String 타입에 기본적으로 많은 메서드와 프로퍼티들이 구현되어 있으며, 문자열과 관련된 연산자도 많이 정의되어 있기 때문에 더 쉽게 다룰 수 있다.

var name: String = "Eunsung"
print("name: \(name)")
name.append(" Choi")
print("name: \(name)")
// String 타입의 변수에 담긴 문자의 수를 알고 싶을 경우 count 프로퍼티를 이용하자.
print("name의 글자 수: \(name.count)")
// String 타입의 변수의 값이 빈 문자열인지 확인하고 싶을 경우 isEmpty 프로퍼티를 이용하자.
print("name이 비어있습니까? \(name.isEmpty)")

결과

name: Eunsung
name: Eunsung Choi
name의 글자 수: 12
name이 비어있습니까? false

✍️ 특수문자

특수문자는 모두 백슬래시()에 특정한 문자를 조합하여 사용한다.

특수문자설명
\n줄바꿈 문자
\\문자열 내에서 백슬래시를 표현하고자 할 때 사용
\*문자열 내에서 큰따옴표를 표현하고자 할 때 사용
\t탭 문자
\0문자열이 끝났음을 알리는 null 문자

✍️ Any와 AnyObject

Any는 그 변수 또는 상수에 어떤 종류의 데이터 타입이든지 상관없이 할당할 수 있는 데에 반해 AnyObject는 클래스의 인스턴스만 할당할 수 있다는 제약이 있다.
하지만, Any와 AnyObject를 사용한다면 매번 타입 확인 및 변환을 해줘야하는 불편함과 예기치 못한 오류를 초래하기 때문에 사용하지 않는 것을 권장한다.

이번 장에서 잘 알아둬야할 것은,
swift는 엄격한 문법을 적용했기 때문에 아래와 같이 다른 타입의 값을 할당할 경우 오류를 내뱉는다는 것이다.

var integer: Int = 1
var unsignedInteger: UInt = -1
integer = unsignedInteger

var floatValue: Float = 3.14
var doubleValue: Double = 3.14
floatValue = doubleValue

결과

Cannot assign value of type 'UInt' to type 'Int'
Cannot assign value of type 'Double' to type 'Float'

끝으로, 언급한 유의할 점을 잘 명심한다면 실수를 줄일 수 있을 것이다.

2개의 댓글

comment-user-thumbnail
2021년 8월 8일

좋은정보 감사합니다 ㅎㅎ

1개의 답글