본문 바로가기
Swift

2. 기본 문법과 타입

by 루에 2015. 9. 21.
반응형

import


import Foundation

import UIKit    // iOS 프로젝트, 플레이그라운드

import Cocoa    // OS X 플레이그라운드


main


전통적으로 main파일의 main함수에서 애플리케이션이 시작하지만 Swift는 별도의 main함수를 작성하지 않는다. main 소스 코드의 글로벌 영역에서 시작.


세미콜론


Objective-C를 포함한 많은 프로그래밍 언어에서 문장 끝에 세미콜론(;)을 붙이지만 Swift에서는 생략할 수 있다. 단 한 줄에 여러 문장을 작성할 때는 세미콜론으로 구분.

var i = 0; i = 1



공백 문자

공백의 위치에 따라서 연산자를 다르게 인식한다. 일반적인 코드는 다음과 같지만

let i1 = 1 + 2

let i2 = 1+2


한 쪽만 붙여 사용할 경우 단항 연산자로 동작해서 에러를 일으킨다. 에러의 예는 다음과 같다.

let i1 = 1+ 2

let i2 = 1+ 2

그러므로 Swift에서는 공백 문자를 주의한다.


범위 연산자


시작값과 종료값으로 구성된 범위를 정의한다. 닫힌 범위(Closed Range)와 반 닫힌 범위(Half Range) 연산자가 있다.

닫힌 범위 : 1...10 (1~10까지)

반닫힌 범위 : 1..<10 (1~9까지. 종료값은 포함하지 않는다)



변수 및 상수 선언


데이터를 다루기 위해 변수와 상수를 이용한다. 값이 변하는 데이터를 다루려면 변수를 이용하고 변하지 않는 데이터는 상수를 이용한다. 상수에 설정된 값은 변경할 수 없다.

var i = 1   // 변수 선언

var f : Float = 1.0 // 변수 이름 뒤에 : 붙여 타입을 지정할 있다

f = 1.2


let i2 = 1  // 상수 선언

i2 = 3  // error


변수와 상수 초기화


자동으로 초기화되지 않으므로 직접 초기화해야 한다. 초기값이 없는 상태에서 사용하면 에러가 발생한다.

var i : Int

println(i)


// Swift1.2부터 상수의 선언과 초기화 분리 가능

let con : Int

con = 20


데이터 타입


스위프트에서 제공하는 기본 데이터 타입

Character

Bool    // true 혹은 false

Int    // 부호가 있는 정수형 타입

UInt    // 부호가 없는 정수형 타입

Float

Double    // 타입을 지정하지 않을 경우 실수형 타입의 기본

String


보통 사용하는 Int타입은 32비트 환경에서 Int32와 같은 크기, 64비트 환경에서 Int64와 같은 크기를 가진다. 데이터타입이 다른 데이터의 크기와 값의 범위는 sizeof()와 max, min 프로퍼티를 이용한다.

sizeof(Int)

Int.max

Int.min


데이터 타입을 변환하는 함수는 타입 이름과 같은 함수를 사용한다. 부울이나 실수 타입의 값을 정수로 변환하려면 Int함수를 사용한다.

var i1 = Int(2.33)

var i2 = Int(false)


같은 정수형 타입에서도 Int8과 Int16은 다른 타입이다. 타입을 섞어서 사용할 경우 에러가 발생한다.


문자와 문자열


Swift에서 문자는 Character를 사용하고 문자열은 String타입을 사용한다. String은 Character의 집합(Collection)이다.

let char1 : Character = "a" // 문자 선언

let string1 : String = "Hello, World!"  // 문자열 선언


문자열 안에 다른 문자열 혹은 다른 타입의 변수와 상수를 포함하고 싶을 경우 역슬래쉬 기호와 괄호를 이용한다. 

let str1 = "aaa"

let str2 = "hello, \(str1)"


포맷 문자열을 이용해 문자열 객체를 생성할 수 있다. 객체형은 %@를 이용한다.

String(format: "%@ ahahah", arguments: "%@ 들어갈 문자열 객체")


문자열 길이는 count("문자열") 전역 함수를 사용한다.

문자열은 + 연산자를 이용해 덧붙일 수 있으나 Character를 덧붙일 경우 에러가 발생한다.

let char1 :Character = "1"

var str = "senfiw" + char1  // error


문자열 변환


다른 데이터 타입을 문자열로 변경하려면 toString 함수를 이용한다.

var str2 = str + toString(char1)

var strFromInt = toString(11)

var strFromFloat = toString(24.2)


문자열 복사와 비교


Swift 문자열 객체는 밸류 타입이다. 밸류 타입은 새로운 변수에 할당하면 복사되어 새로운 객체가 생성되는 특징이 있다. 즉, 복사할 경우 서로 다른 객체가 된다.


튜플


튜플(tuple)은 괄호를 이용해서 여러 값을 하나로 묶은 것으로 다양한 타입의 값을 다룰 수 있다. 하지만 중요하게 사용하는 데이터는 튜플보다는 구조체나 클래스를 이용하는 것이 좋다.

var one = (1, "one", "")   // 정수와 문자열을 혼합한 튜플

// 튜플값을 얻어온다

one.2   // ""

one.1   // "one"


// 튜플 항목에 이름 선언

let two = (num : 1, eng : "one", kr : "")


// 선언한 이름으로 튜플 항목 접근

two.eng // "one"

two.kr  // ""


// 새로운 변수에 대입하여 복사

var second = two

second.eng = "ahah"

second.kr = "koko"

second  // (.0 1, .1 "ahah", .2 "koko")


// 튜플을 이용해서 튜플의 값을 얻어오기. 언더스코어(_) 이용해 생략 가능

let (num, _, _) = two

num // 1


배열


다수의 데이터를 순차적인 번호인 인덱스(index)로 다루는 타입이다. 배열에서 값을 얻거나 변경하려면 인덱스를 사용한다.

배열을 선언하려면 타입을 대괄호로 감싼다. let으로 선언할 경우 내용을 변경할 수 없는 배열(Immutable)이 생성된다.

// 배열 선언

var array : [Int] = [1,2,3,4,5]

let array2 = ["a","b","c"]


// 아무 원소도 포함하지 않는 공백 배열 선언

var emptyArray = [Int]()


// 배열의 항목 참조는 첨자 표현식(subscript) 이용

var e1 = array[0]


// 개수는 count프로퍼티나 count()함수 - Swift1.2 이용

array.count

count(array)

array2.isEmpty  // 공백 배열 확인


// 데이터 추가 / 삭제는 + .append() 이용. 배열의 마지막 인덱스 뒤에 추가

array.append(6) // [1, 2, 3, 4, 5, 6]

array += [7]    // [1, 2, 3, 4, 5, 6, 7]

array[5]    // 6

array[6]    // 7


// 첨자 표현식을 이용해 배열 항목 변경

array[1...3] = [9,7,6]

array   // [1, 9, 7, 6, 5, 6, 7]



딕셔너리


딕셔너리는 키-밸류(key-value) 방식으로 다수의 데이터를 다루는 콜렉션 타입이다. 딕셔너리에 저장된 키는 유일해야 한다. [Key_type, Value_type]으로 정의한다. 데이터에서 타입을 추론할 수 있는 경우 타입 선언이 생략 가능하다.

// 딕셔너리 선언

var dic1 : [String:Int] = ["1":1, "2":2]

var dic2 = [1:1, 2:2, 3:3]


// Key값을 이용해 항목 접근

dic1["2"] // 2


// 저장되어 있지 않는 새로운 키를 이용해 항목 추가

dic1["3"] = 3


// 키를 이용해 값을 입력하거나 updateValue(forKey:) 이용해 기존값 변경

dic1["3"] = 5

dic1.updateValue(7, forKey: "3")


// nil 대입하거나 removeValueForKey 메소드를 이용해 항목 삭제

dic1.removeValueForKey("1")

dic1["2"] = nil

dic1    // ["3": 7]


셋(set)


Swift1.2에 셋 타입이 추가됐다. 셋은 배열이나 딕셔너리와 같이 다수의 데이터를 다루는 콜렉션의 하나로, 같은 항목이 없고 순서가 없는 특징이 있다. 대신 속도가 딕셔너리보다 빠르다.

// set정의

var set1 :Set<Int> = [1,2,3,4,5]    // {5, 2, 3, 1, 4} 정해지는 순서는 없다

var set2 = Set<String>()    // 공백의 객체 생성


// 항목 추가 삭제

set1.insert(6)

set1.remove(5)


// 개수나 항목 포함 여부 확인

set1.count

set1.contains(6)    // true


// first 메소드로 첫번째 값을 불러오지만, 어떤 값이 나올지는 없다.

set1    //  {6, 2, 3, 1, 4}

set1.first


// 인덱스를 이용한 접근은 에러 발생

//set1[1] // error


// 개별 항목을 인덱스로 접근하기 위해서는 배열로 변환이 필요

var array = Array(set1)

array   // [6, 2, 3, 1, 4]


// For-in 이용한 반복문 사용

for i in set1{

    println(i)

}


// 기존 객체를 추가하면, 기존 객체를 덮어쓴다.

set1    // {6, 2, 3, 1, 4}

set1.insert(6)

set1    // {6, 2, 3, 1, 4}


// 집합 연산 기능(합집합에서 교집합이 2 되는건 무시했음)

set1.intersect(array)    // A 교집합 B

set1.exclusiveOr([2,3])  // A 합집합 B - (A 교집합 B)

set1.union(array)        // A 합집합 B

set1.subtract(array)     // A - B


기본 제어문


조건(if)

if 조건문에서 조건에는 반드시 Bool 형태의 결과가 나타나도록 조건을 작성해야 한다. 조건을 감싸는 괄호는 생략할 수 있지만 바디의 중괄호는 반드시 작성해야 한다.

// if 조건문 정의

if 3 > 2 {

    println("result")

}


//else else if

var type = "c"

if type == "A" {

    println()

}

else if type == "b" || type == "d" {

}

else {

    println("c")

}


switch

다른 언어와 조금 다르게 동작한다. switch에는 정수 타입 외에도 다양한 타입의 값을 제어식으로 사용할 수 있다. 그리고 제어식 조건에 맞는 첫 case를 하나만 실행하므로 break 문장을 별도로 작성하지 않는다. default는 반드시 작성해야 한다.

// case 정의

var value = 3

switch value {

case 1:

    println(1)

default:

    println("other")    // 모든 정수를 비교하는 case 없으면 필수 작성

}


// 다수의 값을 나열하거나 범위 연산자

// fallthrough 이용해 이후 case(다른 언어에서 break 선언하지 않은 경우) 실행

switch value {

case 1, 2, 5:

    println("1, 2 혹은 5")

    fallthrough

case 7 ..< 109:

    println("7에서 108사이")

default:

    println("나머지")

}


// case 문자열이나 튜플과 같은 값을 사용

// value-binding 이용해 다양한 형태 패턴 매칭

var value2 = (3, 8)

switch value2 {

case (1, 5):

    println()

case (1 ... 3, 6 ..< 8):

    println("1~3, 6~7")

case (3, let y):

    println("3 \(y)"// value2

default:

    println("other")

}


// where 이용해 바인딩 조건을 추가 작성

var value3 = (7, 7)

switch value3 {

case (1 ..< 3, 1):

    println("(1~3,1)")

case (1, 1 ..< 5):

    println("(1,1~4)")

case (4, _):

    println("(4, 아무값)")

case (5, let y):

    println("(5, y)")

case let (x, y) where x == y:

    println("x y 같을 (\(x), \(y))"// value3

default:

    println("나머지")

}


반복

반복문으로 for나 while문을 사용한다.

// for반복문 정의

for var i = 0; i < 10; i++ {

    print(i)

}


// 콜렉션 타입을 이용한 for-in반복문

var str = "12345"


for c in str {

    print(c)    // 12345

}


// 튜플을 이용해 딕셔너리의 모든 원소 순회

var dic1 : [Int:Int] = [1:1,2:2,3:3]

for (key, value) in dic1 {

    print("key : \(key), value : \(value)") // 3 반복 수행

}


// while do-whie(Swift 1.2이하)

var i = 0

while i < 10 {

    println("i = \(i++)")

}


do {    // Swift 2.0에서 do -> repeat으로 변경(repeat-while)

    print("i = \(i--)")

} while i <= 0




반응형

댓글