제공 : 한빛 네트워크
저자 : 패리스 버터필드-애디슨
역자 : 김현만
원문 : Swift is open source and why you should care
애플의 오픈소스 언어인 스위프트의 첫인상
애플은 그들의 새로운 프로그래밍 언어인 스위프트(Swift)를 오픈소스로 공개했다. WWDC 2015에서 애플은 OSI에서 인정하는 라이선스 형태로 언어들을 공개하겠다고 약속했었다. 우리는 이보다 더 많은 것을 얻을 수 있는데, 컴파일러의 소스코드 뿐만 아니라 모든 OS X와 iOS 애플리케이션을 위한 표준 라이브러리 역할을 하는 파운데이션(Foundation) 라이브러리를 순수 스위프트로만으로 구현된 초기 버전을 얻을 수 있다. 이 모든 것들은 아파치 2.0 라이선스 하에 공개되었다.
애플은 이 소스코드를 공개함으로써, 지금까지 스위프트를 애플이 통제하는 플랫폼들로 제한을 걸어왔던 결정적인 기능 제한이 풀리게 되었다. 이 플랫폼들을 위해 개발하는 것도 멋지지만, 이 플랫폼들은 단지 더 커다란 세상의 일부분일 뿐이다. 더 큰 커뮤니티에서 스위프트를 활용할 수 있도록 함으로써, 이 굉장히 흥미로운 언어는 좀더 광범위한 영역에 적용될 수 있다.
다뤄야 할 내용이 많기 때문에, 3개의 포스트로 나누려고 한다. 이 포스트와 다른 포스트들에서는 다음 내용을 이야기할 것이다.
1. 스위프트가 흥미로운 이유와 스위프트를 이용하여 할 수 있는 것.
2. 오픈소스로 공개된 스위프트의 실질적인 측면.
3. 미래에 스위프트가 유용하게 쓰일만한 곳.
흥미로운 것부터 시작해보자.
왜 스위프트가 흥미로운가?
우선 이것부터 말하고 시작하려고 한다. 애플의 플랫폼들을 위한 개발에 관심이 있거나 이미 개발중이지만 오브젝티브-C(Objective-C)를 사용하고 있다면, 가능하면 빨리 스위프트를 배워야한다. OS X, iOS, tvOS, watchOS와 미래에 나올 애플 플랫폼들을 위한 개발을 하고 있지 않다면, 지금은 실제 스위프트 애플리케이션들을 단지 비 애플 플랫폼들에서 구현될 것들의 개념 검증과 같은 사소한 것들로 제한되지만, 지금도 변화하고 있어서 스위프트의 영향 받는 세계가 확장될 것은 분명하다.
그러면 스위프트가 흥미로운 이유는 무엇인가? 스위프트는 흥미롭고, 똑똑하고 잘 고안된 기능들과 디자인 요소들을 꽤나 많이 가지고 있는 가장 최신의 언어이다. 스위프트는 매우 우아한 문법과 강력한 보안을 가지며 LLVM 컴파일러 프로젝트 결과물 덕분에 매우 빠르다. 스위프트는 개발자에게 Optional, 매우 멋진 오류 처리 시스템(error-handling system) 그리고 스위프트의 프로토콜 지향 아키텍처(protocol-oriented architecture)와 같은 수많은 특별히 흥미로운 요소들을 가지고 있다.
스위프트에서는 값들은 null이 될 수 없다. Int 형식의 어떤 값을 선언한다면 정수값을 필요로 한다. String 형식의 값을 선언한다면, 절대 nil이 될 수 없다.
var myString : StringmyString = nil // error!
변수에 nil을 할당하려고 하면 실제 컴파일러 에러가 발생한다. 스위프트에서 Optional 변수들만이 nil이 될 수 있다. Optional 변수는 다음과 같이 그 타입 뒤에 물음표 표시와 함께 선언된다.
var myOptionalString : String?myOptionalString = nil // allowed
변수가 nil이 될 수 있는 시점과 방법을 엄격하게 제어함으로서 많은 오류들을 피할 수 있다. 컴파일 시에 변수가 null이 될 수 있는지를 결정하기 때문에, 많은 수의 null 체크들을 제거 할 수 있다.
Optional과 함께 스위프트는 재미있는 오류 처리 시스템을 제공한다. 좀더 오래된 오브젝티브-C(Objective-C)에서 사용하던 NSError 시스템에서 유래된 이 시스템은 예외의 관념을 프로그래머의 실수에 기인한 오류와 사용자의 입력 또는 환경에서 발생하는 오류 이 두개의 다른 개념으로 분리한다. 이러한 분리는 중요하다. 어떤 값에 접근하기 전에 배열의 범위를 체크했는데 실패했다면 이는 사용자의 잘못이 아니지만, 앱이 디스크가 꽉 차서 파일을 저장할 수 없다면 사용자에게 알려야만 한다.
그래서 스위프트는 이러한 문제들을 exception과 error로 구분하였다. Exception은 시스템에 의해 발생되고 언제나 특정 오류와 함께 프로그램은 종료하게 된다. 반면 error는 적어도 사용자가 처리할 수 있는 오류에 의해 발생한다.
이 유용한 오류 유형 분리와 함께 오류가 발생할 가능성이 있는 함수(function)들에 대해 특히 신경쓸 수 있는 스위프트 구문을 사용해야 한다. 예를 들어, 다음과 같이 다소 억지로 만든 자바 코드 조각을 생각해보자.
try {
openFile(); String data = getData();
writeToFile(data);} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());}
이 예문에서 try문 내의 세 줄 중 어디에서 예외가 발생할 가능성이 있는지 알기 힘들다. 스위프트로 된 같은 코드를 살펴보자.
do { try openFile() let data = getData() try writeToFile(data)} catch let error { println("Error: (error)")}
자바에서 메소드가 try 블록으로 감싸거나 호출하는 함수가 재전파(re-throw)할 수 있는 예외(exception) 리스트를 가지는 것처럼, 스위프트에서는 error를 던질 수 있는 모든 함수를 do 블록으로 감싸거나 그렇지 않으면 그것들을 호출하는 메소드에 throws 표시해야 한다. 그러나 스위프트는 특이하게 오류를 던질 수 있는 각각의 라인은 try 문이 맨 앞에 위치해야 한다는 점이 다르다. 이 때문에 누구나 어떤 메소드에서 문제가 있을 가능성이 있는지를 코드를 읽으면서 한눈에 이해할 수 있게 된다. 이 예제에서 openFile과 writeToFile은 오류를 일으킬 가능성이 있는 라인이다. 이렇게 즉각적으로 빠르게 이해할 수 있음으로써 프로그래머는 읽는 코드의 흐름 뿐만 아니라 의도도 파악할 수 있게 된다.
마지막으로 스위프는 프로토콜 지향 개발 방법을 엄격하게 고수한다. 많은 언어와 마찬가지로 스위프트에서는 구현(implement)할 수 있는 메소드들을 포함할 수 있도록 고안된 데이터 타입이 있다. Java와 C#에서는 interface를 말하고 C++에서는 abstract base class이다. 스위프트에서는 protocol이라 부른다. 예를 들어, 어떤 데이터를 처리하는 메소드를 정의하는 프로토콜을 다음과 같이 정의할 수 있다.
protocol IntegerProcessing {
func processNumber(number : Int) -> Int}
다음으로 이 프로토콜을 따를 클래스를 선택한다.
class MyNumberProcessor : IntegerProcessing { func processNumber(number : Int) -> Int { return number * 2 }}
이러한 내용은 경험이 많은 객체 지향 프로그래머에게는 매우 일반적인 것들이지만, 대부분 스위프트 표준 라이브러리, 그리고 사실 스위프트 언어 자체가 주로 프로토콜을 통해 구현되었다는 점은 실제로 이 프로토콜에 강점과 유연성을 부여한다.
두개의 값을 비교하는 기능을 포함하는 매우 간단한 예제를 고려해보자. 모든 인기 있는 프로그래밍 언어에서는 두 정수들을 == 연산자를 사용하여 서로 비교할 수 있다
2 == 2 // true
스위프트를 포함하여 소수의 인기있는 언어에서는 이러한 비교 능력을 문자열까지 확장할 수 있다.
"foo" == "bar" // false
이렇게 비교할 수 있는 능력은 Equatable 프로토콜에서 온다. 이 프로토콜을 따르는(Java와 C# 용어로는 "구현(implement)" 모든 클래스는 == 연산자를 구현해야 하며, 이렇게 하여 같은 타입의 두 객체들은 서로 비교될 수 있게 된다.
스위프트 언어의 대부분의 모든 관점은 상속 트리 보다는 객체들의 동작을 정의하는 프로토콜이란 철학에 기인한다. 이는 개발을 할 때 매우 흥미진진한 접근방법이며, 모든 곳에 적용되기를 바라는 점 중에 하나이다.
지금까지 설명한 기능들과 그 외의 기능들은 스위프트가 "빠르고(fast) 최신의(modern) 안전(fafe)하고 상호 작용(interactive)"하게 되는 디자이너들의 목표를 이룰 수 있도록 해주었다. 스위프트는 모바일과 데스크탑 애플리케이션 개발에 매우 강하다. 대화형 REPL을 사용하면 소프트웨어를 빠르게 만들 수 있고 좋은 성능의 결과 코드를 얻게 된다.
다음 포스트에서는 스위프트 오픈소스 공개의 현실적인 측면과 비 애플 개발자들에게는 무엇을 의미하는지를 설명할 것이다. 스포일하자면, 매우 멋지다!