About Swift – “자료형, 변수, 상수, 튜플”
About Swift – “자료형, 변수, 상수, 튜플”
프로그래밍 언어에서의 자료형
프로그래밍 언어를 처음 배운다면, 처음에는 자료형을 배우게 됩니다.컴퓨터는 덧셈, 뺄셈과 같은 사칙연산을 수행하는 일도 하지만, 예컨대 내가 어제 회사에서 저장해 두었던 판매실적 파일 같은 정보를 불러오는 역할도 합니다. 컴퓨터의 역할은 정보를 저장하고, 불러오고, 처리하는 것입니다.
이러한 정보들은 컴퓨터의 메모리라는 공간에 저장되고, 컴퓨터는 이 공간에서 정보를 불러옵니다. 자료형이란 컴퓨터가 메모리에 저장되어 있는 정보를 해석하는 방식입니다. 컴퓨터에서는 논리가 간단하고, 0과 1만을 기억할 수 있는 회로의 특성상 이진법이 다른 것에 비해 편리하기 때문에 이진법을 사용합니다. 이 회로들 안에 0과 1을 저장하고 나서 나중에 필요할 때 불러오는 것입니다.
그런데, 0과 1뿐만 아니라 234,ABC와 같은 것들은 어떻게 사용해야 할까요.컴퓨터는 이진법을 사용합니다. 사람은 0부터 9까지의 숫자를 사용하는 십진법을 사용합니다. 이진법과 십진법 모두 숫자를 나타내는 방식들 중 하나이므로, 십진법은 이진법으로 바뀌어 메모리에 저장될 수 있습니다.
그런데, 문자 B와 같은 것은 컴퓨터에서 어떻게 표현해야 할까요? 컴퓨터에서는 문자와 숫자를 바꿀 수 있도록 하는 표준이 존재합니다. 글자와 코드가 1대 1로 매핑되어 있는 코드표가 존재하는 것입니다. Unicode가 바로 그것인데, 국제적으로 언어를 모두 표시할 수 있는 표준 코드입니다.
예컨대, 당장 바탕 화면에 “test.txt”라는 파일을 만들어, 첫 줄의 내용을 “A”라고 친 다음 저장하기를 누른다면 컴퓨터의 메모리에는 65를 이진법으로 변환한 – 1000001이 저장됩니다. 표준 코드에 따라서, “A”라는 문자를 65라는 숫자로 저장하기로 한 것입니다. 그리고 십진법 숫자인 65를 이진법으로 변환하여 메모리에 저장하는 것이지요.
그런데, “Test.txt”의 두 번째 줄에 숫자 65를 입력하고 저장한다면 컴퓨터는 어떻게 그것을 구분할 수 있을까요? 65 또한 이진법으로 변환되어 메모리에 저장될 것이기 때문입니다.
그리하여, 만들어진 것이 바로 ‘자료형’입니다. 예컨대 C언어에서 정수형 변수 X를 선언하고 그것에 70이라는 숫자를 대입한다면, 변수는 식별자 (어떤 대상을 유일하게 식별 및 구별할 수 있는 이름) 를 가지기 때문에, 나중에 식별자를 통해 정보를 불러왔을 때 그것이 숫자형인지, 문자형인지에 따라서 70이 무엇인지가 갈리게 되는 것입니다. X라는 변수는 정수형이기 때문에 70으로 해석될 것입니다.
Swift에서의 자료형 – 정수 데이터 타입, Int 와 UInt
- 정수(소수점이 없는 수)를 저장하는 데 사용합니다.
- 8비트, 16비트, 32비트, 64비트 정수를 지원합니다.
- 부호 없는 정수를 지원합니다. (UInt)
- Apple에서는 특정 크기의 데이터 타입보다 , Int데이터 타입을 권장하고 있습니다.
- __UInt__는 Unsigined Integer의 약자로, 부호가 없는 양의 정수를 표현하는 데이터 타입입니다.
두 번째 항목에서 언급하였듯이 Swift는 8비트, 16비트, 32비트, 64비트 정수를 지원하는데, 예컨대 부호가 있는 64비트 정수는 Int64 타입입니다. – 하지만, 사용자가 코드를 작성하는 환경에 맞게 Int타입의 크기도 저절로 달라집니다. 32비트 플랫폼에서 코들르 작성하는 경우 Int타입을 사용하면 Int32 타입과 같은 크기를 가지게 되는 것입니다.
네 번째 항목에서 언급하였듯이 애플에서는 특정한 크기의 정수를 꼭 사용해야 하는 것이 아니라면 정수 값을 위해 항상 Int 타입을 사용하는 것을 권장하고 있습니다. 코드의 일관성과 상호운용성을 높이기에 유리하다고 합니다.
마찬가지로 UInt32처럼 UInt타입에도 뒤에 숫자가 붙으면, 해당 타입이 가질 수 있는 값의 범위가 구체적으로 정해지지만, UInt의 경우에는 Int와 마찬가지로 사용자가 코드를 작성하는 환경에 따라 타입의 크기도 저절로 달라집니다. Int와 비슷한, 그러나 부호가 없는 성격을 가진다고 이해하시면 되겠습니다.
아래는 Int64형과 Int8형의 최대 크기를 알아보는 예제입니다.
print("Int64 최솟값 = \(Int64.min) Int64 최댓값 = \(Int64.max)")
print("Int8 최솟값 = \(Int8.min) Int8 최댓값 = \(Int8.max)")
print("UInt8 최솟값 = \(UInt8.min) UInt8 최댓값 = \(UInt8.max)")
- Int64 최솟값 = -9223372036854775808 Int64 최댓값 = 9223372036854775807
- Int8 최솟값 = -128 Int8 최댓값 = 127
- UInt8 최솟값 = 0 UInt8 최댓값 = 255
Swift에서의 자료형 – 실수형 데이터 타입, Float와 Double
- 소수점이 있는 숫자를 저장하는 데에 사용합니다.
- Float 타입과, Double 타입을 제공합니다.
- Float 타입 : 64비트로 소수점 수를 저장하고 소수점 15자리 정확도를 가집니다.
- Double 타입 : 32 비트로 소수점 수를 저장하고, 소수점 6자리 정확도를 가집니다.
- 애플에서는 Double이든 Float이든 상관이 없다면 Double을 사용하는 것을 권장하고 있습니다.
- 기본적으로 Double 형을 사용합니다.
기본적으로 Double 형을 사용한다는 것은 다음과 같은 상황입니다.
var x = 55.85
print(type(of:x))
- var x라는 문장으로 x라는 이름의 변수를 선언하였습니다.
- print(type(of:x)) 는 x라는 이름의 변수의 자료형을 print하는 문장인데, 초깃값을 실수형으로 설정했기 때문에 컴파일러가 타입 추론을 통하여 기본적으로 Double형으로 인식한 것을 볼 수 있습니다.
Swift에서의 자료형 – 논리형 데이터 타입, Bool
- 참 또는 거짓, (1 또는 0) 조건을 처리하는 데이터 타입입니다.
- Boolean 데이터 타입을 처리하기 위해서는 두개의 불리언 상수, true와 false를 사용합니다.
var amIstrong:Bool = false
print(amIstrong)
var amIweak:Bool = true
print(amIweak)
- 변수를 선언할 때 초깃값을 true로 두었으므로, :Bool은 생략해도 됩니다.
- 만약 amIstrong:Bool 에 0과 같은 숫자를 대입하면 컴파일러에서 오류가 납니다.
Swift에서의 자료형 – 문자 데이터 타입, Character
- 문자, 숫자, 문장 부호, 심볼 같은 유니코드(Unicode) 문자 하나를 저장합니다.
- var 변수명: Character = "X"
- 초깃값은 작은 따옴표가 아니라, 큰 따옴표를 사용해야 합니다.
- \u를 사용해서 유니코드 문자를 할당할 수 있습니다.
var x : Character = "X"
var x2 : Character = "\u{0058}"
print(x)
print(x2)
- 두 번째 줄에서, 유니코드를 이용하여 변수에 문자를 할당하였습니다.
- 두 번째 줄에서 Character를 생략하면 String형으로 인식합니다.
Swift에서의 자료형 – 문자열 데이터 타입, String
- 단어나 문장을 구성하는 일련의 문자입니다.
- 저장, 검색, 비교, 문자열 연력, 수정 등의 기능을 포함합니다.
- string interpolation을 사용하여 문자열과 변수, 상수, 표현식, 함수 호출의 조합으로도 만들 수 있습니다.
var MyName = "Gyun"
var weight = 67
var bodyfat = 15.2
var message = "\(MyName)의 체중은 \(weight)이고, 체지방률은 \(bodyfat)% 입니다."
print(message)
print(type(of:message))
message의 자료형은 여전히 String이라는 것을 알 수 있습니다.
Swift에서의 특수문자/이스케이프 시퀀스
- 표준 문자 세트뿐만 아니라 문자열에 개행, 탭, 또는 유니코드 값과 같은 항목을 지정할 수 있는 여러 특수 문자도 있습니다.
- 특수 문자들은 역슬래시를 접두어로 하여 구별합니다.
- 역슬래시로 시작되는 모든 문자는 특수 문자로 간주합니다.
- 역슬래시 문자 자체는 "\"으로 표현합니다.
- \n ― 개행
- \r ― 캐리지 리턴(carriage return)
- \t ― 수평 탭
- \ ― 역슬래시
- " ― 큰따옴표(문자열 선언부에 큰따옴표를 쓰고 싶을 경우에 사용됨)
- ‘ ― 작은따옴표(문자열 선언부에 작은따옴표를 쓰고 싶을 경우에 사용됨)
- \u{nn} ― nn 위치에 유니코드 문자를 표현하는 두 개의 16진수가 배치되는 1바이트 유니코드 스칼라
- \u{nnnn} ― nnnn 위치에 유니코드 문자를 표현하는 네 개의 16진수가 배치되는 2바이트 유니코드 스칼라
- \U{nnnnnnnn} ― nnnnnnnn 위치에 유니코드 문자를 표현하는 네 개의 16진수가 배치되는 4바이트 유니코드 스칼라
Swift에서의 변수, 상수 사용하기
- 기본적으로 변수란, 프로그램에서 사용될 데이터를 저장하기 위한 메모리 공간입니다.
- 변수에 할당된 값은 변경이 가능합니다.
- 상수란 데이터 값을 저장하기 위하여 메모리 내의 명명된 공간을 제공한다는 점에서 변수와 비슷합니다.
- 어떠한 값이 한 번 할당되면, 이후에 변경될 수 없습니다.
- 상수는 코드 내에서 반복적으로 사용되는 값이 있을 경우에 유용합니다.
- 코드 내에서 반복적으로 사용되는 특정 값을 매번 사용하는 것보다, 그 값을 상수에 할당한 다음 코드 내에서 참조하면 코드 읽기가 더 쉬워집니다.
- 변수나 상수 이름은 영문자, 숫자, 유니코드도 가능합니다.
- 변수는 var을 이용해 선언할 수 있습니다. 변수를 선언할 때에 값을 가지고 초기화도 가능합니다.
- 상수는 let을 이용해 선언할 수 있습니다. Apple에서는 변수보다는 상수를 사용하라고 권장하고 있습니다.
var x = 1, y = 2, z = 3 // 이러한 방식으로 변수를 여러 개 선언할 수 있습니다.
let 1day = 24 //예컨대 하루는 변하지 않는 24시간입니다. 상수를 이용하여 1day = 24라고 못박아둘 수도 있겠습니다.
Swift에서의 어노테이션, 타입 추론
- Swift는 타입 안전 프로그래밍 언어입니다. 변수의 데이터 타입이 식별된다면, 그 변수는 다른 타입의 데이터를 저장하는 데에 사용할 수 없습니다. 예컨대 x라는 변수에 int형을 대입하기로 식별되었다면 – "hello world"와 같은 String 자료형을 대입하는 데에는 x라는 변수를 사용할 수 없습니다.
- 상수와 변수에서 타입을 식별하는 방법에는 두 가지가 있습니다.
- 첫 번째 방법은 – 변수나 상수를 선언하는 시점에 type annotation을 사용하는 것입니다.
var x : Int = 10 // Int 10으로, 변/상수 이름 다음에 타입 선언, type annotation
- 두 번째 방법은 컴파일러가 타입을 식별하기 위해서 타입 추론을 사용하는 것입니다.
var x = 10 annotation // 선언부에 타입 어노테이션이 없으면 스위프트 컴파일러는 상수 또는 변수의 타입을 식별하기 위하여
타입 추론(type inference) 사용
- 상수를 선언할 때에도, 타입 어노테이션을 사용한다면 나중에 코드에서 그 값을 할당할 수 있습니다.
let Myname: String // Myname 변수를 String으로 타입 어노테이션
var Country = true
if Country {
Myname = "Smith"
} else {
Myname = "Yamamoto"
}
print(name)
Swift에서의 튜플 기능
- 단 한 줄의 코드로 튜플의 모든 값을 추출하여 변수 또는 상수에 할당할 수 있습니다.
- 튜플의 값을 선택적으로 추출하는 데 사용될 수 있으며, 무시하고 싶은 값에 밑줄을 사용하면, 그 값은 무시할 수 있습니다.
- 튜플을 생성할 때 각 값에 이름을 할당할 수도 있습니다.
- 튜플에 저장된 값에 할당된 이름은 각 값을 참조하는 데 사용할 수 있습니다.
let myTuple = (10, 12.1, "Hi")
print(type(of:myTuple)) // myTuple의 자료형을 알 수 있습니다.
let (myInt, myFloat, myString) = myTuple
print(myInt) // 10
let myTuple2 = (count: 10, length: 12.1, message: "Hi") //이름 할당
print(type(of:myTuple2)) // myTuple2의 자료형을 알 수 있습니다.
print(myTuple2.message)
//결과
// (Int, Double, String)
// 10
// (count: Int, length: Double, message: String)
// Hi
제가 이해한 변수, 상수, 타입 어노테이션, 타입 추론, 튜플입니다.