2014년 6월 17일 화요일

스위프트(Swift) 가이드

애플이 WWDC2014에서 기습적으로 스위프트(Swift)를 발표해 버린 이후, 똥 밟은걸 털어낸다는 심경으로 스위프트를 공부해 보는 겸 블로그에 글을 써 왔다. 이 글은 지금까지 써 온 블로그 글을 한데 모은 길찾기용 글이다.

Swift?

스위프트를 대표하는 단어라면 type-safe 라는 단어가 있을 것 같다. 문법이 간단해서 쉽게 구현하니 뭐니는 장점이 아닌것 같다. 이 말은 요즘 스크립트 언어들의 대세인 동적인 언어와는 좀 다르다. 기능이 많아서 생각보다 복잡해 보인다.

언어의 모양을 보면 요즘 대세인 스크립트 언어 - 특히 Python - 의 특징을 가지고 있으면서도 Objective-C 스러운 모양을 아주 약간 가지고 있는 것 같다. 하지만 C와 비슷한 부분은 블럭을 중괄호({})로 구분한다는 점 뿐이지 완전히 다른 모습을 가지고 있다.

[관련글] Swift 언어에 대한 인상
[관련글] Swift - 기본 공통사항
[관련글] Objective-C에서 Swift로 넘어가기
[관련글] Objective-C에서 Swift로 넘어가기 #2

Swift Release Notes:
Swift 2.0:

변수와 상수(Variable and Constant)

변수는 일반적인 타입 변수, 즉 값을 설정하고 바꾸고 하는게 자유로운 이름을 가진 인스턴스(Instance 혹은 Object)다. 반대로 상수는 값을 바꿀 수 없는 인스턴스이다. 스위프트는 이 둘을 아주 편하게(?) 정의할 수 있는 문법을 가지고 있다.
// 상수 정의
let constantString = "THIS IS CONSTANT"
constantString = "UPDATE"      // 컴파일 에러가 발생한다.

// 변수 생성
var variableName = 10
variableName = 20
let은 상수를 만들고 var는 변수를 만든다.

[관련글] Swift - 변수와 상수 그리고 타입
[관련글] Swift - let(상수선언)에 대해 파고들기
[관련글] Swift - 문자열(String)
[관련글] Swift - 옵셔널(Optionals)
[관련글] Swift - 튜플(Tuple)
[관련글] Swift - 값(Value)과 레퍼런스(Reference)
[관련글] 연산형 지역 변수(Local Computed Variables)

컬렉션(Collection)

고전적인 자료구조(Data Structure)라는 표현과 비슷할 수도 있겠지만, 하나 이상의 데이터를 동적으로 가지는 컨테이너 타입을 대충 Collection 이라 부른다.
let myArray = [ 1, 2, 3, 4, 5 ]
let myDict = [ "A": 1, "B": 2 ]
많이 쓰이는 배열(Array) - 혹은 리스트 - 와 사전(Dictionary) 형이 주요 컬렉션이다.

Swift 1.2 부터 컬렉션 타입으로 'Set' 타입이 추가될 예정이다.

[관련글] Swift - 컬렉션 타입(Collection Types)
[관련글] Swift - Collection 타입의 도구들: map, filter, reduce, zip
[관련글] Swift 1.2 - Set 타입

제어구조(Conditional Control)

'제어구조' 라는 말 자체는 아래 코드 예제면 설명이 될 것 같다.
if a > b {
    println("a is bigger than b")
}
비교(논리식)를 통해 분기를 결정하는 것은 언어에서 가장 중요한 부분이 아닐까. swift에서는 if 문을 비롯하여 switch-case 문을 자주 쓰게 될 것 같다.

[관련글] Swift - 논리 제어문(Conditional Statements)
[관련글] Swift - 옵셔널(Optionals)
[관련글] Swift 2.0 - guard 문
[관련글] Swift 2.0 - defer 문​
[관련글] Range, 범위에 대한 이야기 | Swift

루프(Loop)

루프는 특정 코드를 2번 이상 실행시켜야 할 때 쓴다.
for i in 1...10 {
    println("i = \(i)")
}
말은 이상하지만, 어쨌든 루프라는 말은 거의 모든 언어에서 공통적으로 쓰이는 말이라 오해하는 사람은 없을 것 같다. -_-

[관련글] Swift - 루프(Loop)
[관련글] Swift - 순차적 타입(Sequence Type) 만들기



함수(Function)

함수란 특정 코드 단위라고 부를 수도 있고 기능 단위라고 부를 수도 있다. 편리성과 가독성을 확보하기 위한 최소한의 예의일지도...
func someFunc(paramA: Int, paramB: String) -> String {
    return "\(paramA) - \(paramB)"
}

someFunc(10, "Ten")
클래스와 클로져(Closure) 설명에도 꼭 필요한 내용이다.

[관련글] Swift - 함수(Function)

클로져(Closure)

클로져도 일종의 함수라고 볼 수 있다. 하지만 그 선언 방식이나 동작에 있어서는 함수와는 좀 다른 방식으로 생성되고 동작한다.
reversed = sort(nameList, 
                { (s1: String, s2: String) -> Bool in return s1 > s2 })
위 코드는 스위프트 공식 전자책의 한 예제이다. 굵게 표시된 부분이 한 줄 함수로 구현된 간단한 클로져이다. 마치 Objective-C의 블럭 문법(Block Syntax)과 비슷한 것 같다.

[관련글] Swift - 클로져(Closure)
[관련글] Swift Memory Management #4 클로져(Closure)의 경우
[관련글] Swift 2.0 - CFunctionPointer 대신 클로저 사용하기​

열거형(Enumerations)

열거형은 숫자가 아닌 키워드 형식으로 개발자가 원하는 여러 값을 선언하고 사용하는데 도움을 준다. C의 enum 과 거의 동일한 용도의 오퍼레이터다.
enum LifeType {
    case None
    case Human
    case Animal
    case Bug
}
[관련글] Swift - 열거형(Enumerations)

구조체(Structure)

구조체는 여러 개의 데이터를 한꺼번에 가지는 특수한 컨테이너 타입을 창조하기 위한 개념이다. 그런데 스위프트의 struct 문법은 클래스와 거의 비슷하다. 무려 메소드를 가질 수 있다.
struct MyDate {
    var year = 1
    var month = 1
    var day = 1

    func print() {
        println("\(year)-\(month)-\(day)")
    }
}
[관련글] Swift - 구조체(Structure) 훑어보기
[관련글] Swift - 프로퍼티(Properties)
[관련글] Swift - 메소드(Method)
[관련글] Swift - 생성자와 파괴자(Initialization and Deinitialization)
[관련글] Swift - 프로토콜(Protocols)
[관련글] Swift - 확장(Extensions)
[관련글] Swift - 서브스크립트(Subscripts)
[관련글] Swift - 제너릭(Generics)
[관련글] Swift Memory Management #3 구조체(struct)와 클래스(class)
[관련글] Swift - 언제 class 대신 struct 를 사용하는가

클래스(Class)

OOP(Object Orientation Programming)에서 가장 중요한 것이 클래스이다. 스위프트의 클래스는 단일상속을 지원하며 Objective-C 보다 좀 더 간결한 문법을 제공한다.
class MyDate: BaseDate {
    var year = 0
    var month = 0
    var day = 0
    var name: String {
        return "\(self.year)-\(self.month)-\(self.day)"
    }
    
    init(y: Int, m: Int, d: Int) {
        self.year = y
        self.month = m
        self.day = d
    }
    
    func print() {
        println(self.name)
    }
}
[관련글] Swift - 클래스(Class) 훑어보기
[관련글] Swift - 프로퍼티(Properties)

오퍼레이터 오버로드(Operator Overloads)

스위프트는 오퍼레이터(연산자)의 기능을 확장시키기 위한 오버로딩을 지원한다.
@infix func == (left: MyType, right: MyType) -> Bool {
    if (left.a == right.a && left.b == right.b) {
        return true
    }
    return false
}
자신만의 타입을 만들었다면 오퍼레이터도 이를 지원하도록 하면 좋을(?) 것이다.

[관련글] Swift - 오퍼레이터 오버로드(Operator Overloads)

예제로 보는 스위프트

실제로 사용 할 수 있는 코드를 기반으로 언어를 공부하는 것도 좋은 선택이다. 도움이 될지는 잘 모르겠지만 관련 예제를 링크한다.

기타 스위프트 관련글

관련 외부 링크

댓글 4개 :

익명 :

우와... 정말 대단하시네요.
이런 글로그를 보다니 꿈 같습니다.
해외에서 혼자 공부하고있는 중인데 한줄기 빛과 같은 곳이네요 ㅎ
앞으로도 좋은일만 가득하시길 바랍니다!
: )

Seorenn :

감사합니다.. :-)

Cring :

정말 많은 도움받아갑니다.
궁금했던점을 많이 해소시킬 수 있었습니다. 감사합니다 ^^

익명 :

대단한 정보예요 어디서 이렇게 많이???