2014년 6월 10일 화요일

Swift - 변수와 상수 그리고 타입

변수(Variable)와 상수(Constant Variable) 그리고 타입(Type)은 모든 언어에서 가지는 공통적인 요소다. 아주 기초적인 내용이라고도 볼 수 있지만 스위프트의 특징이 드러나는 만큼 적는 김에 관련 정보를 적어본다.

변수 (Variable)

그냥 변수다. 변수. 값 마음대로 설정하고 바꿀 수 있는 변수. 더 이상의 설명이 필요할까.
var a = 1
var b = "B"
var c = 5 + 6
c = c + a
var 라는 키워드로 변수를 정의 할 수 있다. 물론 정의된 변수는 이후 값을 바꾸거나 할 수 있다.

var로 생성 시 값을 대입했다면 컴파일 타임 때 자동으로 타입이 결정된다. 따라서 생성된 이후 해당 변수에는 해당 타입에 맞는 값만 대입이 가능하다. 이는 분명 다른 동적인 스크립트 언어와는 다른 점이다.

약간의 팁이 있다면 콤마를 구분자로 써서 한 줄에 다량의 변수를 선언 할 수도 있다.
var a = 1, b = "B", c = 5 + 6
이런 문법은 상황에 따라 편하게 쓸 수도 있다.

생성 시 타입을 별도로 결정 해 줄 수도 있다.
var a: Int = 1
var b: String = "B"
아예 생성자를 이용해 초기화 시키는 것도 가능하다.
var a = Int(1)
var b = String("B")
위 방법은 클래스를 인스턴스화 하는 방법과 동일한데 결과는 같으므로 편한대로 쓰면 될 것 같다.

스위프트의 변수는 독특하게도 nil로 초기화를 할 수 없다. 물론 불가능한건 아니다. 단지 옵셔널에 관한 글에서 별도로 정리한다.

[관련글] Swift - 옵셔널(Optionals)

상수 (Constant)

상수란 변수와 비슷하지만 한번 생성되면 값을 변경 할 수 없다. 스위프트는 let 키워드를 이용하면 상수를 만들 수 있다. 물론 상수이기에 정의 시 반드시 값도 정의해 주어야 한다.
let myWidth = 100.0
let myHeight = myWidth * 0.5
var rectAreaSize = myWidth * myHeight
let defaultAreaSize = rectAreaSize
위 예제의 마지막 라인을 제외하곤 일반적인 상수라서 그러려니 할 수 있겠는데 마지막 라인에 주목하자. 변수를 이용해 상수를 정의하고 있다. 이는 스위프트의 상수가 일반적인 상수와는 좀 다른 '동적인 상수' 라고 추측 할 수 있게한다.

상수도 변수와 마찬가지로 초기화에 따라 타입이 자동으로 결정되지만 타입을 별도로 정의해 줄 수 있다.
let myName = "Test Name"
let yourName: String = "Your Name"
let thisWidth = Double(123.45)

상수도 변수와 마찬가지로 nil을 바로 가질 수는 없다. 역시 옵셔널을 참고하자.

[관련글] Swift - 옵셔널(Optionals)

일반적인 타입들

Int - 정수형

타입의 선두주자(?) 정수형은 그 영어 철자인 Integer의 앞 글자를 따서 Int라는 이름을 가지고 있다. 실제로 생성되는 타입은 플랫폼이 32비트냐 64비트냐에 따라 Int32 혹은 Int64 이긴 하지만 크게 신경 쓸 필요는 없다.
let intA = 1
var intB = 2
var intC = Int(3)
var intD: Int64 = 4
이 외에 부호 없는(Unsigned) 정수 타입으로 UInt8 같은 것을 쓸 수 있다. UInt8은 BYTE라고 표기하기도 하는 자주 쓰이는 타입이기도 하다.
let byteValue: UInt8 = 255
정수형(Int)는 실제 타입의 비트 크기에 따라 최대값과 최소값이 정해져 있고 이를 max, min 프로퍼티를 참고해 확인 할 수 있다. 오버플로우(overflow)를 방지하려면 체크 해 두는 것도 나쁘진 않다.
println("Int MAX = \(Int.max)")
println("Int MIN = \(Int.min)")

Float, Double - 실수형(부동소수점)

실수 - 소수점이 찍힌 숫자 - 타입은 Float와 Double 형이 있다.
let a = 1.0
var b: Float = 22.45
var c = Double(100.99)
Float는 32비트형, Double은 64비트형이라고 알아두자. 비트가 크면 당연히 더 큰 수치도 보관할 수 있다 라고 생각할 수 있고 틀린 말은 아니다. 단지 부동소수점에 한해서는 '정확도가 높아진다' 라고 표현하는게 정확하다.

실수형은 최대크기와 최소크기의 존재가 유동적이기 때문에 .max나 .min 같은 형식을 이용 할 수 없다.

Character - 문자형

하나의 단문자를 표기하기 위한 타입이다.
var charA = Character("A")
let han = Character("한")
물론 한글도 한 글자 범주에 든다.

String - 문자열형

Character가 한 개 이상 모인것이 문자열이다. 한 개도 포함한다는 것에 유의하자.
let strA = "STRING A"
var strB = "STRING B"
var strC: String = "STRING C"
var strD = String("STRING D")
[관련글] Swift - 문자열(String)

Bool - 이진형(Boolean)

true와 false라는 특수 논리 데이터를 가질 수 있는 타입이다. if 문 등 제어를 위해서 사용되는데 자주 쓰이는 표현이니 아마도 다른 언어를 알고 있다면 익숙할 것이다.

[관련글] 논리 제어문(Conditional Statements)

Array - 배열 혹은 리스트형

하나 이상의 아이템을 연속으로 담을 수 있는 데이터 타입이다.

[관련글] Swift - 컬렉션 타입(Collection Types)

Dictionary - 사전형

키와 키에 매칭되는 데이터를 하나 이상 가징 수 있는 데이터 타입이다.

[관련글] Swift - 컬렉션 타입(Collection Types)

Range - 범위형

Swift에만 존재하는 특수 타입이다. 점3개(...) 혹은 점2개(..) 점 두 개에 꺽쇠(..<)의 좌우에 숫자 혹은 변수나 상수 등을 줘서 범위를 설정하는데 사용된다. Python 에서는 range()를 이용해 리스트(list)를 생성하는 형식과 비교된다.
1...5      // 1, 2, 3, 4, 5
0..<10      // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
점 3개(...)일 경우는 사람식의 표기이고 '..<' 일 경우는 0 based index 형식이다. 즉 A...B 는 A부터 B 까지이고 A..<B는 A부터 B-1까지이다.

Range는 주로 for-in 루프에서 많이 사용된다. 물론 용도야 쓰기 나름이지만...

업데이트: '..<' 키워드는 Xcode 6 Beta 3 부터 도입되었다.

[관련글] Swift - 루프(Loop)

Tuple - 튜플

여러개의 아이템을 콤마로 구분해서 만드는 리스트 형태의 타입, 개인적으로는 변경 불가능 배열이라고 설명하기도 한다.

[관련글] Swift - 튜플(Tuple)

Optional - 옵셔널

값이 없다는 의미인 nil을 표현하기 위한 스위프트만의 특수한 타입이자 개념이다.

[관련글] Swift - 옵셔널(Optionals)

타입은 이 외에도 다양하게 존재하지만 여기서는 자주 쓰이는 위의 것들만 정리한다.

Any - 아무 타입
AnyObject - 아무 오브젝트

둘은 Objective-C의 id(혹은 void *)와 비슷한 용도로 사용되는 타입이다. Any 는 어떠한 타입이든 지칭이 가능하고, AnyObject는 어떠한 타입의 오브젝트 즉 클래스를 통해 생성된 인스턴스를 지칭 할 수 있다.

이 타입은 여러 타입을 가질 수 있기 때문에 타입을 확인 할 수 있는 'is' 라는 특수 커맨드가 제공된다.
let dec = 10
let some: Any = dec
if some is Int {
    println("dec is Int")
}
마치 Objective-C의 isKindOfClass: 메소드와 비슷하다. 하지만 좀 다른점은 (현 시점에선) Any류가 아닌 다른 정해진 타입들에서는 is 오퍼레이터를 사용 할 수 없다는 점이다.

타입 별명짓기(Type Aliases)

Swift에선 C의 typedef와 비슷한 용도로 typealias가 있다.
typealias LongInteger = Int64
let v = LongInteger(12345)
이 별명(alias) 기능은 코드 가독성을 위해서 사용되는 경우가 많다.

형변환

C언어 및 파생 언어의 형변환(Type Casting) 방식은 Swift에선 쓸 수가 없다. 대신 해당 타입 클래스를 이용해 생성하거나 형변환 메소드를 활용하면 간단히 할 수 있다.
let doubleValue = 10.9
let intValue = Int(doubleValue)   // intValue = 10
let strValue = "123"
let intValue2 = strValue.toInt()  // intValue2 = 123
위 첫째 라인 코드처럼 실수를 정수형으로 변환하면 소수점 아래는 다 사라진다. 유의하자.

다른 방법이 있을 수도 있지만 일단 여기까지...

[관련글] Swift - let(상수선언)에 대해 파고들기
[돌아가기] 스위프트(Swift) 가이드

댓글 없음 :