본문 바로가기

iOS/Swift

iOS) Swift에 대한 고찰

iOS 개발자라면 익숙한 Swift에 대해서 알아보려 합니다.

Swift는 Apple WWDC 2014에서 공개된 언어입니다. 그전까지는  Objective-C가 애플의 표준 프로그래밍 언어였습니다. Objective-C와의 비교는 나중에 다른 글에서 다뤄보겠습니다.

Swift 이미지 - https://swift.org/

Swift는 safety, performance, design patterns를 고려한 상당히 높은 high-level 언어입니다. 여기서 high-level 언어는 인간 친화적인 언어, 기계어에서 높은 수준의 추상화된 언어를 의미합니다. 어셈블리처럼 레지스터, 메모리 주소, call stack등을 프로그래머가 직접 다루는 것이 아닌 변수, 배열, 객체, 함수 등으로 기계 언어를 추상화함으로써 효율적인 코드 작성이 가능해집니다. 앞서 상당히 높은 고수준 언어라고 한 표현은, C언어도 어셈블리 언어에 비하면 high-level 언어이기 때문입니다. 현대에 이르러선 C언어가 low-level로 불리고 있지만 (메모리 관리를 직접 해야 합니다.) C언어는 과거에는 high-level 언어였고, 현대에 이르러서도 관점에 따라 high-level 언어로 불릴 수 있습니다.

 

 

공식적인 Swift의 특징은 Safe, Fast, Expressive입니다.

 

Safe.

Swift는 안전성을 위해 Type safety와, var과 let,  Optional을 적용했습니다.

Type safety, 컴퓨터에서 모든 값은 숫자입니다. char은 아스키코드, string은 포인터값으로 나타낼 수 있습니다. C언어에서는 warning은 나오지만 타입이 달라도 값을 넣을 수 있습니다. 하지만 swift에서는 타입이 다르면 값을 넣을 수 없게 설계되었습니다. 그리고 초기화되지 않은 값은 사용할 수 없습니다. 

var과 let, 변수의 의도를 명확히 하기 위해 let과 var 키워드로 변수를 선언합니다.

Optional, 옵셔널을 이용하여 NULL 포인터 충돌을 보다 안전하게 구현하였습니다. 여기서 재밌는 건 Swift에선 클래스에 대한 NULL 포인터란 의미로 이를 구분지어 nil로 표현합니다.

 

Fast.

Swift github에 따르면, Swift는 여러 언어와 Objective-C에서 영감을 얻은 독립적인 언어라고합니다. Swift 컴파일러는 대부분 C++로 구현되어있습니다. 또한 Swift 컴파일러는 LLVM 기반이기 때문에 최종적으로 기계어로 번역됩니다.

공식적으로 Objective-C 보단 2.6배 이상,Python 2.7보단 8.4배 빠르다고 합니다. 검증은 DFS로 했다고 하는데, Apple의 주장입니다.

스위프트 속도 자랑 -https://www.apple.com/swift/

그리고 Swift가 채택한 ARC는 컴파일 타임에 동작하여(GC는 런타임에 동작) 일반적으로 ARC가 성능이 빠릅니다. 그렇지만 메모리가 충분히 여유가 있는 상황에선 오히려 최신 GC가 빠를 수 있다고 합니다. 

 

Expressive.

구문과 문법이 깔끔합니다.

Swift는 오픈소스입니다. 꾸준한 피드백을 통해 컴파일러와 프로그래머를 위한 기능을 만듭니다. C++ STL과 비교해서 Swift의 Collection이 Array, Set, Dictionary 3가지 밖에 없다는 점도 신선했습니다.

 

 

Swift는 정적타입언어인가?

정적타입언어와 동적타입언어의 정의가 모호해서 다수가 생각하는 의미를 통해 swift가 어떤 언어인지 정의하겠습니다.

stackoverflow.com/questions/1517582/what-is-the-difference-between-statically-typed-and-dynamically-typed-languages

Stackoverflow에 따라 정적타입언어와 동적타입언어를 정의하겠습니다. 

컴파일 타임에 변수 유형을 알고있을 경우 이를 정적타입언어(Statically typed languages)라 합니다. 프로그래머가 Type을 지정하거나, Type을 추론해주는것도 포함합니다. 실행 시간 중 값(run-time values)에 따라 결정될 경우 동적타입언어(Dynamically typed languages)라 합니다.

이 정의에 따르면, swift는 컴파일타임에 모든 타입이 결정되므로 정적타입언어(Statically typed languages)라 할 수 있습니다.

고찰

다른 언어를 하다가 Swift에 접해서 제가 느낀 생각을 적겠습니다. Swift는 컴파일이 되면 웬만하면 에러가 나지 않는다는 점이 매력적이었습니다. C언어의 경우 컴파일은 잘되지만 Sigabort, Segement fault 등 런타임중에 에러가 많이 났었는데, Swift는 그런 점이 없습니다. 또한 Method나 Property 이름이 직관적이어서 기능을 쉽게 유추할 수 있습니다. 다만 유의해야 할 점이 있다면 Collection입니다. 개발자의 실수를 방지하기 위해 Array, Dictionary가 Value type이고 효율성을 위해 Copy on write를 이용하는데, 이는 기존 다른 언어 개발자라면 Collection을 Reference type으로 착각하여 의도하지 않은 결과를 나타낼 수 있습니다.

 

References

swift.org/about/

developer.apple.com/kr/support/app-store/

en.wikipedia.org/wiki/High-level_programming_language

docs.swift.org/swift-book/LanguageGuide/TheBasics.html#ID322

github.com/apple/swift

www.apple.com/swift/

stackoverflow.com/questions/1517582/what-is-the-difference-between-statically-typed-and-dynamically-typed-languages

academy.realm.io/kr/posts/swift-internals-llvm-type-system-swift-foundation/

docs.elementscompiler.com/Concepts/ARCvsGC/

www.quora.com/Why-doesnt-Apple-Swift-adopt-the-memory-management-method-of-garbage-collection-like-Java-uses

stackoverflow.com/questions/1517582/what-is-the-difference-between-statically-typed-and-dynamically-typed-languages

 

'iOS > Swift' 카테고리의 다른 글

iOS) Swift의 Time complexity에 관한 고찰  (9) 2021.02.12