한 언어에 대한 전반적인 내용을 써 본 건 스위프트(Swift) 언어가 처음이다. 공부하는 겸 글을 싸질렀지만 그 덕분에 많은 도움이 되기도 했다. 그리고 그 덕분인지 언어에 대한 인상이라는 글을 쓸 기회가 생긴 것 같다.
어라 헤더가 없네?
가장 첫 인상은 헤더(Header) 같이 별도로 정의된 스펙 문서가 없어서 마치 스크립트 언어를 연상케 하는 겉모습이었다. 문법 자체도 간결해 보여서 마치 Python을 컴파일이 가능한 버전으로 만든 건 같았다.
하지만 이내 헤더가 없음에 약간의 좌절도 느꼈다. 숨기고 싶은 인터페이스와 공개하고 싶은 인터페이스를 어떻게 구분할 수 있을까? 이런 느낌은 현재 내가 하고 있는 SDK 개발 처럼, 특정한 라이브러리 등을 외부에 제공해야 할 때 하게되는 고민 같다.
Type Safe?
타입 안전(type-safe)이라는 표현은 뭐라고 하는 것이 좋을까? 개인적으로는 스위프트는 ‘타입 강제’ 언어라는 표현이 더 어울린다고 생각한다.
타입 세이프의 의미는 값과 타입 간의 관계를 명확히 한다는 표현이다. 그런데 이건 결국 '컴파일 타임 때 타입이 반드시 결정’ 이라는 제한으로 이루어진다. 그 덕분에 오버플로우 체크를 엄격하게 할 수 있는 길을 만들어 놨다.
현대적인 스크립트 언어들과의 차이점이 여기서 보인다. 대게 이런 언어들은 타입이 동적(Dynamic)이다. 한 변수의 타입이 하나가 아니라 다른 것으로 런타임 때 마구 바뀔 수 있다. 그래서 스크립트언어가 느리다는 것은 잘 알려져있다.
물론 뭐든 장단점과 특징이 있기 마련. 타입 강제라는 표현은 나쁘다라는 의미가 아니라 특징이라고 받아들이자.
강력한 언어 != 간결한 언어
문법(Syntax) 면에서 스위프트는 결코 간결하지 않다. 애플이 WWDC에서 이야기 한 ‘빠르게 개발 할 수 있는 언어’ 라는 표현은 틀렸다고 생각한다. 사용 할 수 있는 키워드도 많고 제한 사항도 많고 이상한 규칙도 많다.
물론 언어에 익숙해지고 몸에 익는다면 개발속도는 빨라지게 마련이다. 그런데 이건 모든 언어에 대해 할 수 있는 말이다.
오히려 구식 C 언어 같은 언어가 간결한 문법을 가지고 있다. 그 만큼 언어를 배울 때의 시간은 적게 소모된다. 스위프트는 언어를 배우는데 소모되는 시간이 좀 길다고 느껴진다. (물론 C의 포인터 같은 이질적인 뭔가는 사람에 따라 다르겠지만...)
다만 스위프트로 모듈을 잘 만들어 놓으면 이 모듈을 가져다 쓰는 개발자 입장에서는 편하고 빠르게 개발이 가능하다는 것은 부정하기 힘들다.
퍼포먼스를 위함인가 개념을 위한 의도인가
간혹 스위프트를 보다보면 의 존재하는지 이해하기 힘든 문법이 보인다. 예를 들어 override 라던가 mutating 같은 것이다.
사실 override는 코드 읽기 측면에서 도움이 될 수도 있다. 상위 클래스의 구현을 보지 않고도 이 메소드가 상속받아서 재구현(오버라이드) 되어 있다고 바로 파악 할 수 있기 때문이다. 그렇다면 강제로 명시하지 않아도 되는 것 아닌가? 스위프트는 현재 override 키워드를 강제하고 있다.
가장 이해하기 힘든 것은 mutating 이다. 구조체의 경우 멤버 프로퍼티를 메소드에서 수정하는 것을 기본적으로 제한하고 있다. 수정하고 싶다면 반드시 mutating 을 명시해야 한다. 그런데 이건 무슨 의도가 있는건가? 아니면 퍼포먼스를 위한 특수한 설계인가? 왜 굳이 struct 에서만 mutating을 명시해야 하는가? class는 왜 mutating이 없어도 되는가?
컴파일러 입장에서 보면 mutating 이든 override 이든 명시하지 않아도 코드를 보고 알아서 파악은 가능하다. 다만 문법에서 일부러 쓰도록 강요하고 있다.
느린데 제법 빠르다
스위프트가 발표되고 Xcode 6 베타가 즉시 발표됨에 따라 언어 벤치마크도 제법 활발하게 이루어졌다. 하지만 대부분 스위프트가 느리다는 결과를 보여주고 있다.
그런데 문제는 컴파일러 최적화 옵션(-Ofast)을 주면 C++에 버금갈 정도로 빨라진다는데 있다. 도데체 최적화를 안하면 뭔 짓을 하길래 이렇게 느릴까?
아직은 NextStep 에서 벗어나질 못 했다.
물론 이는 기본 프레임워크 때문일지도 모르겠지만, 아직은 많은 기본적이어야 할 데이터타입이 NS로 시작하는 이름의 클래스에 의존적이다. NS는 NextStep의 약자이고 Objective-C 를 대표하는 프레임워크이기도 했다. 그런데 NS Framework 들은 스위프트 문법과 어울리지 않다는 생각이다.
Array나 Dictionary 같은 타입은 잘 벗어났으면서 왜 NSDate는 Date로 벗어나질 못 하는걸까? 심지어 String 조차 NSString의 브릿지를 많이 제공하고 있는데 이는 스위프트 고유의 것은 아니다.
섵부른 이야기 일 수도 있지만, 스위프트는 아직 미완성이라고 생각한다. 즉 나중에는 벗어날 것 같다는 생각이다.
Po<LLVM>wer
LLVM이 대단한 것은 사실이고 실제로 좋다고 생각한다. 이건 그냥 넘어가자.
현재 스위프트의 장점 중 상당수는 이 LLVM에 의해 포장되어 있다고 느껴진다. 스위프트 소개에는 LLVM의 소개가 빠지질 않는다.
Xcode 6의 플레이그라운드 기능은 유용하다. 하지만 이 기능은 LLVM에 의존적이다. 제대로 된 플레이 그라운드가 나오려면 컴파일 방식이 아닌 좀 느리더라도 인터프리터가 제공되는 편이 좋지 않을까?
LLVM이 대단하긴 하지만 스위프트라는 언어만 본다면 제외하고 생각하는게 좋다는 느낌이다.
미완성
결론은 이걸로 맺어질 것 같다. 이 언어가 개발된지 4년 밖에 안되었고 다른 유명 언어들은 대게 10년 이상 개발된 언어들이라는 차이를 보자. 스위프트는 계속 변해갈 것이다. 다만 현 시점에선 아직 1.0 을 내놓기 이전의 알파라는 느낌이 강하다.
앞서 몇 가지 관련 이야기를 했었지만 또 다른 예를 하나 들어보자. class 에서 static 키워드를 사용하면 에러가 난다. 그런데 에러 내용을 봤는가. "static 은 아직 class 에서는 지원하지 않는다.” 이런 에러 메시지가 돌아온다.
심지어 OOP에서 가장 기본으로 삼는 포장화(Access Control)도 없다. 드러내고 싶은 멤버는 public 으로, 감추고 싶은 멤버는 private 로 만들어 주는 등 클래스 포장 기술은 OOP의 기본이다. 그런데 왜 없나? 일단 Xcode 6 Beta 2 에서는 Known Issue로 분류되어 있기에 나중에 추가될 것은 확실하다.
결국 기본적으로 제공되어야 할 것이 없기에 스위프트를 미완성이라 평가하는 것이다.
미래는 어떻게 될지 알 수가 없다. 느긋하게 가는 편하지만 느린 미래일까 아니면 카오스급 급변의 미래일까. ;-)
[관련글] 스위프트(Swift) 가이드
Popular Posts
-
Q. 1.3과 1.12 중 어느 버전이 더 최신 버전인가요? A. 1.12가 더 최신버전입니다. 위의 같은 질문류를 커뮤니티에서 본 적이 있는데 놀랍게도 1.3을 1.12보다 더 높은 버전으로 생각하는 사람이 많은 것 같았다. 그래서 이번에는 버...
-
이번 글은 굉장히 유명한 수학 함수 3가지를 적어보는 글입니다. 그리고 오랜만에 구어체가 아닌 존대말(?)로 쓰는 글이기도 하겠네요. 이번에 언급하는 함수 세 가지, 즉 ceil(), floor(), round() 함수는 C 언어 시절부터 쓰이...
-
제목대로 나는 안드로이드를 혐오하는데... 그 이유를 적기 보단 경험담을 적어볼까 한다. 직접 경험한, 그리고 주변 사람들의 경험담이다. 물론 글로 표현하기 위해 과장하거나 고쳤다 -_-; [참고] 이 글은 2011년 5월 경에 쓰여진 글입니다. ...
-
예전에 Vim에서 tags 파일 경로를 부모 디렉토리들로 지정해서 자동으로 태그를 지정하는 방법 을 포스팅 했던 적이 있다. 하지만 Emacs에서는 동일한 형태로 지정을 해서 사용하는게 안되었다. 이런 기능을 원했지만 검색으로 찾을 수는 없었다. ...
-
최신의 Emacs 22~23 에서는 한글 폰트 설정에 따른 불편함은 많이 사라진 편이지만, 역시 마음에 드는 폰트 설정은 힘든 편이었다. 특히 영문과 한글 폰트를 별도로 설정해야 하는 경우 크기를 맞추는 등의 삽질이 필요한 편이다.
-
sigsegv 검색을 통해 유입된 내역이 하나 보여서 잠깐 설명.
-
Vim이 강력한 편집기로써 군림하게 된 건 편한 키맵, 정규표현식, 그리고 이 매크로 레코딩 기능이 있기 때문이라고 감히 주장하고 싶다. 레코딩 기능은 사용자가 입력하는 키를 그대로 녹화해서 매크로로 만들어 주는 기능이다. 이 기능에 대해 간단히...
-
메소드(Method)란 클래스에 정의된 클래스 멤버 함수를 의미한다. 스위프트(Swift)에서는 클래스 뿐만 아니라 구조체에서도 동일하게 이 메소드를 정의 할 수 있다는 특징이 있다.
-
Git로 다수의 브랜치를 관리하며 브랜치간 머지(merge) 하기는 굉장히 간단한 일이다. 하지만 의외로 다른 브랜치의 일부 파일만 복사(즉 파일간 머지)해 오는 형태의 작업은 많이 하지 않나보다. 찾아보니 의외로 기존 명령어에 옵션을 하나 추가해서 ...
-
Swift 의 Range 기능은 1.0 이라는 초창기 버전 부터 존재했으며 Swift 버전이 올라감에 따라 여러 가지 기능이 붙거나 세분화 되었습니다. 그런데 제 블로그에서는 별도로 정리를 한 글이 없어서 이 범위(Range)에 대한 것을 정리해 봅니...
Tags
Blog Archive
-
▼
2014
(91)
-
▼
6월
(37)
- Xcode Playground Killer Codes
- Objective-C에서 Swift로 넘어가기 #2
- 예제로 보는 스위프트(Swift) - MyDatetime 클래스
- Swift - 병렬 프로그래밍(Concurrency Programming) 가이드
- Swift - GCD(Grand Central Dispatch) 기초
- Swift - NSOperationQueue 병렬 프로그래밍 기초
- Swift - NSThread 병렬 프로그래밍 기초
- Objective-C에서 Swift로 넘어가기
- Swift - 유용한 전처리기(Preprocessor)
- Swift 언어에 대한 인상
- 스위프트(Swift) 가이드
- Swift - 제너릭(Generics)
- Swift - 오퍼레이터 오버로드(Operator Overloads)
- Swift - 서브스크립트(Subscripts)
- Swift - 확장(Extensions)
- Swift - 프로토콜(Protocols)
- Swift - 생성자와 파괴자(Initialization and Deinitialization)
- Swift - 메소드(Method)
- Swift - 싱글톤 패턴(Singleton Pattern)
- Swift - 프로퍼티(Properties)
- Swift - 클래스(Class) 훑어보기
- Swift - 구조체(Structure) 훑어보기
- Swift - 열거형(Enumerations)
- Swift - 루프(Loop)
- Swift - 논리 제어문(Conditional Statements)
- Swift - 컬렉션 타입(Collection Types)
- Swift - 클로져(Closures)
- Swift - 함수(Function)
- Swift - 튜플(Tuple)
- Swift - 기본 공통사항
- Swift - 변수와 상수 그리고 타입
- Swift - 옵셔널(Optionals)
- Swift - 문자열(String)
- Homebrew로 설치한 Macvim 에서 Python 관련 이상증상
- Swift 루프 퍼포먼스 테스트
- Xcode 6 플레이그라운드 시작
- Xcode 6 Beta를 설치해보다
-
▼
6월
(37)
0 comments:
댓글 쓰기