애플 국제 개발자 컨퍼런스(WWDC) 2014에서 스위프트 (Swift)라는 새로운 프로그램 언어가 발표되었다. 사실 이 컨퍼런스에서 여러가지가 주목을 끌고 있지만 그중 스위프트는 개발자로서 내 관심을 끌었다. 원래 나는 얼리어답터가 아니라 나랑 직접 관련이 없는 것이면(애플은 나와 상관 없는 세계였다) 새로운 것이 나와도 그냥 그런가보다 했다. 모두들 자바스크립트의 신세계를 개척하는 데 바쁘고 모바일은 자바스크립트를 제외하면 자바와 오브젝티브-C로 팽팽한 상황에서 새로운 언어라니! 이건 필시 오브젝티브-C를 넘어 보다 많은 개발자를 끌어모으겠다는 전략?!
참고로 애플이 새로이 발표한 것들은 다음과 같은 것이다. OS X Yosemite를 선보이면서 이번 가을에 공개된다고 발표했다. 또한 iOS 새 버전으로 8을 발표했고 iOS 개발자를 위한 그래픽 라이브러리 Metal을 발표했는데 GPU 전담 그래픽에 대한 CPU 부하를 최소화한다고 한다. HomeKit이라고 가정용으로 여러 가전 기구를 연결하기 위한 iOS 및 하드웨어용 프레임웍도 들고 나왔고 HealthKit이라고 건강 관련 앱끼리 데이터를 교환하기 위한 서비스도 들고 나왔다.
아무튼 애플의 개발자 라이브러리를 펼쳐봤다.
첫 소개 문장이 다음과 같다.
Swift is a new programming language for iOS and OS X apps that builds on the best of C and Objective-C (스위프트는 iOS와 OS X 앱을 위한 새로운 프로그램 언어로서 C와 오브젝티브-C의 장점 위에서 만들어졌습니다)
분명히 오브젝티브-C를 염두에 둔 것이다. 또한 설명에서도 계속해서 보면 오브젝티브-C를 계속해서 발전시켜왔는데 그 기반 위에서 몇 년간 스위프트를 개발해왔으며 오브젝티브-C 기존 개발자와 새로운 개발자 모두가 쉽게 접근할 수 있을 것이라고 말하고 있다. 잘은 모르지만 얼핏 오브젝티브-C의 언어 구문을 봤을 때 낯선 나라에 온 것 같았는데 스위프트는 정말 좀더 많은 개발자가 쉽게 다가갈 수 있을까?
스위프트 언어의 특징을 살펴보자.
다음은 온전한 하나의 프로그램이다.
println("Hello, world")
위의 단순한 예에서 보듯 기본적인 언어 구조는 자바스크립트와 같은 스크립트 언어와 비슷한 듯하다. 프로그램 시작을 나타내는 선언부가 없고 외부 라이브러리를 불러오는 것이 없다는 걸 보니 말이다.
다음으로 변수는 var
로 선언하고 상수는 let
으로 선언한다.
var myVariable = 42
myVariable = 50
let myConstant = 42
변수와 상수 선언을 각각의 키워드로 만든 것은 안전성을 염두에 둔 언어 설계라고 밝히고 있다. 개발자의 의도가 명확해지기 때문이다.
자료형에 있어서는 변수를 처음 선언할 때 자료형이 유지가 돼서 다른 자료형을 대입할 수 없다고 한다. 그리고 보통은 위와 같이 자료형을 명시하지 않지만 다음과 같이 명시할 수도 있다고 한다.
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
자료형을 섞을 때 자동 형변환은 없다고 한다. 명시적으로 변환이 필요하다. 아래에서 문자열과 숫자를 이어붙이는 과정에서 숫자를 문자열로 변환하고 있다.
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
그런데 문자열 서식 기능이 있어서 아래처럼 더 낫게 쓸 수 있다. \(
)
사이의 코드는 문자열이 아니라 코드로 처리된다.
let widthLabel = "The width is \(width)"
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
배열 및 사전(맵)은 자바스크립트와 비슷한 구문이지만 빈 값을 선언할 때라든가 자료형을 명시할 수 있다는 점이 다르다.
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
// 위에서는 자료형을 유추할 수 있지만 아래처럼 빈 값은 자료형을 명시한다
let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()
이제 제어문을 보자. if문이나 for문이나 조건절 또는 제어절에 괄호를 붙일 필요는 없지만 실행절에는 중괄호를 반드시 감싸야 한다.
if temperatureInFahrenheit <= 32 {
println("It's very cold. Consider wearing a scarf.")
} else {
println("It's not that cold. Wear a t-shirt.")
}
// index 값을 1 ~ 5로 증가시킨다. 이때 index는 let으로 선언하지 않아도 된다.
for index in 1...5 {
println("\(index) times 5 is \(index * 5)")
}
// 배열에 대한 반복문이다
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
println("Hello, \(name)!")
}
// 사전에 대한 반복문이다
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
println("\(animalName)s have \(legCount) legs")
}
// C 스타일 for문도 가능하다
for var index = 0; index < 3; ++index {
println("index is \(index)")
}
함수는 func
로 선언하고 인자의 자료형, 반환하는 자료형을 명시한다.
func sayHelloAgain(personName: String) -> String {
return "Hello again, " + personName + "!"
}
// 반환하는 게 없는 함수는 다음과 같이 선언한다
func sayGoodbye(personName: String) {
println("Goodbye, \(personName)!")
}
// 스위프트의 가장 큰 특징 중 하나로 반환 값이 여럿이 될 수 있다
func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
... // 함수 내용 생략
return (vowels, consonants, others)
}
// 위와 같이 선언하고 아래처럼 호출한다
let total = count("some arbitrary string!")
println("\(total.vowels) vowels and \(total.consonants) consonants")
마지막으로 클래스에 대해 언급하자면 스위프트는 클래스(class
)와 구조체(struct
)를 지원한다. C++처럼 두 가지는 거의 비슷하지만 스위프트의 구조체는 클래스의 상속 개념이 없다.
글을 마치며
주마간산식으로 몇 가지 관심 있는 사항만 쭉 훑어봤는데 최근의 언어 경향을 꽤 반영한 듯하다. OOP는 기본이고 클로져라든가 객체 참조 관리 개념이 있다. 그리고 전체적으로 다양한 언어 구문에 대해 편의성이 들어가 있다. switch
문이 if 문을 바꿔쓰기만 한 형태가 아니라는 점도 그렇다. 또한 모토에 맞게 프로그램 속도라든가 개발 도구의 다양한 UI 응답성을 강조하고 있는 면도 돋보인다(예전에 애플 디자이너/개발자였던 Bret Victor의 프로그래밍 지향과 비슷하다)
당장에 내가 애플 개발을 하는 건 없지만 혹시라도 언젠가 아이폰 앱이라도 개발한다면 오브젝티브-C보다는 쉽게 접근해서 좀더 생산성이 높아지지 않을까 하는 생각이 든다. 자바스크립트나 C/C++에 익숙하다면 쉽게 접근할 수 있는 언어로 보인다. 애플이 얼마나 이 언어를 밀고끌고 할지 모르겠지만 또 다시 개발자들을 향해 한 수 던진 건 분명해 보인다.