2014년 Objective-C 를 대체할 새로운 언어로 스위프트가 발표되었습니다.

스위프트 GM 버전까지는 스위프트의 급격한 변화는 잦아들었고, 여기서부터 어느 정도 안정성을 갖춘 언어로서 자리잡았습니다.

2015년 스위프트 2.0에서 구문에 대한 보완과 오류 검출 기능이 추가되었습니다. 여기서 부터 앱 개발 플랫폼으로 사용하기 충분한 언어로서의 면모를 갖추게 되었습니다.

추가로 스위프트의 오픈소스화와 리눅스용 컴파일러 제공하게 되면서, 애플 기기용 앱만이 아닌 다른 기기에서 실행 될 수 있는 다양한 소프트웨어를 개발할 수 있게 되고, 특히 리눅스용 컴파일러를 제공하겠다는 것은 서버 프로그래밍을 스위프트로도 할 수 있게 되었다는 뜻입니다.

이제 스위프트가 발표된지 4년이 지나갑니다. 스위프트는 그동안 가장 핫한 신생 언어로서 여러 언어 순위 차트에 그 이름을 올려놓았으며, 주요 언어를 꼽을 때 빠지지 않는 핵심 언어로 자리 잡아가고 있습니다. 초기에는 찾아보기 힘들었던 각종 샘플 코드들도 이제는 어렵지 않게 찾아볼 수 있어 개발 부담을 덜 수 있게 되었죠. 스위프트를 사용하여 앱을 개발하는 것이 오브젝티브-C 보다 더 쉬워져 가고 있다는 뜻입니다.

1. 스위프트 언어의 탄생과 배경

스위프트는 애플이 2014년 세개 개발자 대회에서 발표한 새로운 언어입니다. 그 동안 앱을 개발하는 데에 사용되던 오브젝티브-C를 대체할 목적으로 발표된 언어입니다.

이전 주력 언어였던 오브젝티브-C는 C언어를 기초로 하여 스몰토크의 메시지 전달 개념과 객체 지향 개념을 방영한, 말그대로 객체지향형 C언어 입니다. 이러한 특성 때문에 그동안 iOS 앱을 개발하기 위해서는 C 언어의 저수준 프로그래밍과 스몰토크의 객체지향 개념을 동시에 구현해야 한다는 부담이 있었습니다. 게다가 C 언어의 장점이자 단점인 포인터 개념은 오브젝티브-C를 강력한 언어로 만들어주긴 했지만, 처음 접근하는 사람에게는 그만큼 높은 장벽으로 작용하기도 했습니다.

프로그래밍을 익히는데 어려움이 있다보니, 프로그래밍 공부에 지쳐 앱 개발을 포기하는 일도 잦았습니다. 앱의 다양한 기능에 집중해야할 개발자가 성능 개선에 더 많은 노력과 시간을 소모하는 현상을 가져오기도 했습니다.

이는 애플이 바라는 앱 생태계와는 다소 거리가 있었습니다. 애플은 앱 개발자들이 기술적으로 더 훌륭한 앱을 만들기보다는 기능적으로 더 다양한 종류의 앱을 만들기를 원했기 때문에, 아이디어를 가진 많은 잠재적 개발자들까지도 마음만 먹으면 손쉽게 앱을 구현할 수 있는 환경을 만들어주는 것이 당면 과제였습니다.

이같은 목적성에 기초하여 기능이 아니라 성능에 관련된 많은 부분, 특히 코드 최적화나 메모리 관리, 성능 관리 등의 기술 경험 기반 개발 이슈를 시스템이 전담하여 개발자들의 부담을 덜어주는 것이 가장 중요했습니다.

이러한 목표를 위해 만들어진 언어 플랫폼이 바로 스위프트입니다. 스위프트는 기존의 오브젝티브-C가 C 언어로부터 가져온 저수준 프로그래밍을 자동 관리 영역으로 대체했고, 생소한 문법이지만 객체지향을 위해 사용할 수밖에 없었던 스몰토크의 메시지 문법을 사람들에게 익숙한 자바, 파이썬, C#의 문법으로 바꾸었으며, 오브젝티브-C와 호환까지 가능하도록 설계되는 등 여러 가지 언어적 강점을 지녔습니다.

오브젝티브-C가 고급 개발자를 대상으로 사용된 언어라면 스위프트는 개발에 갓 입문하는 사람들까지 무리 없이 사용할 수 있는 언어입니다. 그 대표적인 기능이 바로 인터랙티브 플레이그라운드 입니다.

[ Swift Playground ]

Untitled

직관적으로 코드를 작성하여 그 결과까지 볼 수 있는 이 편집기는 왼쪽의 편집 창에서 코드를 작성하면 중간 경과물을 보여줄 뿐만 아니라 즉석에서 컴파일하여 처리 결과까지 제공합니다. 직관적인 사용자 인터페이스를 통하여 쉬운 접근을 추구하는 애플의 철학이 반영된 결과물인 것이죠.

기술적인 관점에서 스위프트는 애플의 메인 프레임워크인 코코아 프레임워크와 코코아 터치 프레임워크를 모두 사용할 수 있습니다. LLVM 컴파일러, 옵티마이저, 오토벡터링, ARC 메모리 관리, 런타임 환경 등을 기존 언어의 개발 환경과 거의 동일하게 사용할 수 있다는 장점도 있죠.

2. 스위프트 언어의 특징

[ 프로그래밍 언어들의 생산성과 성능 그래프 ]

Untitled

위 그림은 스위프트의 개발 생산성과 앱 성능에 대한 포지셔닝 그래프 입니다. 상대적으로 언어에 대한 진입 장벽이 낮고 개발하기 쉬운 자바스크립트나 파이썬, 루비와 같은 동적 바인딩 타입의 언어는 생산성이 좋지만 성능이 부족한 경우가 많고, 성능이 좋은 언어일수록 진입 장벽이 높고 개발하기 어려워 생산성이 낮은 경우가 많습니다. 이에 비해 스위프트는 개발 생산성과 앱 성능 모두에서 만족할 만한 결과를 가져오는 언어로 포지셔닝되어 있습니다.

스위프트는 데이터 타입 추론 기능에 의해 컴파일러가 알아서 변수와 상수의 타입을 결정하기 때문에 마치 동적 바인딩 언어인 것처럼 착각되기도 하지만, 기본적으로 스위프트는 정적 바인딩 언어입니다.

또한 스위프트는 데이터 타입에 대한 구분이 엄격합니다. 스위프트에서 선언된 변수와 상수는 컴파일 단계에서 데이터 타입이 미리 정의되어 있어야 하고, 일단 변수의 데이터 타입이 정의되면 다른 타입으로 변경할 수 없습니다. 컴파일러는 타입에 맞지 않는 데이터가 변수에 대입되는 것을 사전에 차단하여 안정성을 높일 수 있습니다.

스위프트는 네임스페이스를 사용하여 필요한 객체들을 참조하는데, 일반적으로 프로젝트 전체가 네임스페이스의 범위로 지정됩니다. 이는 같은 프로젝트 내에 작성된 객체일지라도 오브젝티브-C에서는 참조를 위해 일일이 헤더 파일을 반입해 주어야 했던 것과 다르게, 스위프트에서는 같은 프로젝트 내에 작성된 객체들은 반입 과정 없이 참조할 수 있다는 뜻입니다.

2-1. 스위프트 언어에서 차용하고 있는 주요 기능들

스위프트는 기술적으로 새롭다고 할 수 있지만 다른 언어에서 채택된 개념들을 조합한 것이 많습니다. 스위프트를 만들면서 주변 언어로부터 차용한 10가지 개념과 특징들에 대해 InfoWorld.com 에서 이야기하고 있는 글을 인용하여 스위프트의 특성을 다른 언어들과 비교해 보겠습니다.