Swift 언어의 특징은?
상대적으로 언어에 대한 진입 장벽이 낮고
개발하기 쉬운 자바스크립트나 파이썬,
루비와 같은 동적 바인딩 타입의 언어는 생산성이 좋지만 성능이 부족한 경우가 많고,
성능이 좋은 언어일수록 진입 장벽이 높고 개발하기 어려워 생산성이 낮은 경우가 많습니다.
이에 비해 스위프트는 개발 생산성과 앱 성능 모두에서
만족할 만한 결과를 가져오는 언어로 포지셔닝되어 있습니다.
스위프트는 데이터 타입 추론 기능에 의해 컴파일러가 알아서 변수와 상수의 타입을 결정하기 때문에
마치 동적 바인딩 언어인 것처럼 착각되기도 하지만,
기본적으로 스위프트는 정적 바인딩 언어입니다.
또한
스위프트는 데이터 타입에 대한 구분이 엄격합니다.
스위프트에서 선언된 변수와 상수는 컴파일 단계에서 데이터 타입이 미리 정의되어 있어야 하고,
일단 변수의 데이터 타입이 정의되면 다른 타입으로 변경할 수 없습니다.
컴파일러는 타입에 맞지 않는 데이터가 변수에 대입되는 것을 사전에 차단하여 안정성을 높일 수 있습니다.
스위프트는 네임스페이스를 사용하여 필요한 객체들을 참조하는데,
일반적으로 프로젝트 전체가 네임스페이스의 범위로 지정됩니다.
이는 같은 프로젝트 내에 작성된 객체일지라도 오브젝티브-C에서는
참조를 위해 일일이 헤더 파일을 반입해 주어야 했던 것과 다르게,
스위프트에서는 같은 프로젝트 내에 작성된 객체들은 반입 과정 없이 참조할 수 있다는 뜻입니다.
Swift 언어에서 차용하고 있는 주요 기능들을 알아보겠습니다.
Swift는 기술적으로 새롭다고 할 수 있지만
다른 언어에서 채택된 개념들을 조합한 것이 많습니다.
스위프트를 만들면서 주변 언어로부터 차용한 10가지 개념과 특징들에 대해
InfoWorld.com 에서 이야기하고 있는 글을 인용하여
스위프트의 특성을 다른 언어들과 비교해 보겠습니다.
딕셔너리(해시 테이블) - 자바스크립트, 파이썬
대괄호 구문을 이용하여 값을 배열로 만들거나 문자열을 입력받는데,
이것이 해시 테이블 역할을 합니다.
애플에서는 이것을 딕셔너리(Dictionaries)라고 부르며,
초기화할 수 있는 구문을 제공합니다.
데이터 타입 추론 - 함수형 프로그래밍 언어
최근의 컴파일러들은 데이터로부터 스스로 형식을 추론할 수 있으므로
컴파일러가 알아서 변수에 데이터 형식을 지정할 수 있게 되었습니다.
이러한 움직임은 ML과 같은 함수형 언어로부터 시작되었으며,
이후 하스켈, 스칼라, 오파 등의 언어에도 등장했습니다.
데이터 타입은 강제하지만,
데이터 타입을 생략할 수 있는도록 스위프트 컴파일러도 발전하였습니다.
데이터 구조체 타입 선언 - C#과 자바
제네릭 타입은 '<'와 '>' 기호를 이용하여 데이터 구조체에 저장될 형식을 지정하곤 합니다.
이와 동일한 방법으로 데이터 구조체에 저장될 타입을 컴파일러에게 미리 알려줄 수 있게 되었습니다.
문자열 템플릿 - 콜드 퓨전, JSP, 파이썬 등
편의를 위해 많은 프로그래밍 도구들이 변수값을 문자열 템플릿에 삽입하는 기능을 제공합니다.
스위프트는 역슬래시와 함께 소괄호를 작성하고,
그 안에 평가할 식이나 변수를 넣어 출력해주는 깔끔한 텔플릿 시스템을 제공합니다.
불과 세 번의 부가적인 키 입력으로 문자열 템플릿을 제공하는 이 방식은
아마 같은 기능을 수행하기 위한 키 입력 중에서는 가장 적은 수일 것입니다.
선택 사항인 세미콜론 - 자바스크립트와 파이썬
세미콜론(;)은 한 행의 구문이 끝났음을 알려주는 간편한 방법이지만,
어떤 이유에서인지 세미콜론을 입력하기 싫어하는 개발자의 수가 점점 늘어나는 것 같습니다.
스위프트에서 세미콜론은 라인 끝에 붙일 수 있는 선택 사항입니다.
여러 구문을 한 라인으로 묶어야 할 때에는 세미콜론이 필요하지만,
각 구문을 개별 라인으로 작성할 때는 애써 힘들여가며 세미콜론 기호를 입력할 필요는 없습니다.
프로토콜(인터페이스) - 자바와 C#
자바와 C#에서 정교한 객체지향 클래스 구조체를 만드는 프로그래머는
가장 먼저 기본 인터페이스부터 설계를 시작하는 경우가 많습니다.
인터페이스는 클래스가 정의에 부합하기 위해 제공해야 하는 모든 함수에 대한 구조를 정의하는 기본 클래스입니다.
스위프트에서는 클래스 모음의 인터페이스에 대해 '프로토콜(Protocol)'이라는 용어를 사용합니다.
튜플(Tuple) - 리스프와 파이썬
함수나 메소드에서 가끔 두 개 이상의 값을 반환해야 할 때가 있습니다.
리스프와 같은 초기 언어는 모든 요소를 튜플 목록으로 간주했는데,
파이썬 같은 근래의 언어는 메소드에서 반환되는 N개의 값과
여기에 바인딩되는 N개의 변수를 맞추기 위한 명시적인 구문을 제공합니다.
스위프트도 이 방식을 따라 튜플을 지원합니다.
자동 참조(가비지 콜렉터 비슷) - 자바, C#, 오브젝티브-C
가비지 콜렉터는 메모리를 탐색하면서 더는 사용되지 않는 메모리 영역을 회수하는 자동 루틴으로,
앞 글자를 따서 GC라고 불리기도 합니다.
자바와 C# 프로그래머들은 가비지 콜렉터를 무척 좋아하지만,
때로는 가비지 콜렉터 때문에 프로그램이 잠깐 멈추는 현상이 발생하기도 합니다.
가비지 콜렉터의 결과로 가용 메모리가 다시 늘어나는 장점이 있는 반면,
가비지 콜렉터를 실행하는 동안 프로세스는 원활한 진행을 방해 받는다는 단점도 있습니다.
스위프트는 자동 참조 카운트(.ARC - Auto Referencing Counter)를 사용하는데,
이는 오브젝티브-C 사용자들 사이에서 널리 사용된 것과 비슷한 솔루션입니다.
이 기능은 오브젝티브-C에서 물려받았다고 할 만한 기능입니다.
부호 있는 정수와 부호 없는 정수 - C#과 오브젝티브-C
좋은 시스템 프로그램이란 바이트 레벨에서 작동하는 프로그램을 의미하는 경우가 많습니다.
스위프트 역시 1, 2, 4, 8바이트의 부호 없는 정수와 부호 있는 정수를 제공합니다.
클로저(Closure) - 리스프와 스킴에서 자바스크립트까지
자바스크립트 프로그래머는 소량의 코드를 묶어서 함수처럼 전달하는 클로저를 사용할 수 있습니다.
스위프트는 클로저를 제공할 뿐만 아니라 함수를 1급 객체로 간주, 인자값으로 함수 자체를 전달하는 기능을 제공합니다.
멀티 라인 쿼우팅(Multi-Line Quoting)
스위프트에서 4.0 이후, 파이썬과 같이 멀티 라인 쿼우팅 문법을 거의 그대로 도입하였습니다.
파이썬처럼 큰따옴표를 세 개 겹친 (""")로 문자열의 시작과 끝을 나타내는 방식으로
우리는 여러 줄의 문자열을 간편하게 입력할 수 있게 되었습니다.
이는 여러 줄의 문자열을 입력하기 위해 더이상 문자열 내부에
인위적인 줄바꿈 문자('\n')를 넣어주지 않아도 된다는 뜻이기도 합니다.
구조적인 특징으로는 다음과 같습니다!
스위프트의 발표 자료에 따른 스위프트 언어의 구조적 특성은 여섯 가지 정도로 구분됩니다.
이들 특성은 스위프트가 지향하는 방향성이기도 합니다.
빠름(Fast)
애플에서는 고성능 앱을 만들기 위해 GCC 대신 LLVM 컴파일러를 사용해오고 있는데, 이 컴파일러에서 제공하는 코드 최적화기를 사용하여 소스 컴파일과 최적화를 수행함으로써 스위프트의 성능을 극대화 할 수 있습니다.
설계에 의한 안전성(Safety by Design)
스위프트는 언어 차원에서 안전성을 담보하기 위한 설계로 여러 장치를 해 두었습니다.
변수나 상수는 반드시 선언한 후에 사용하도록 강제하였으며
타입 추론 기능에 의해 변수의 초기값을 기준으로 타입을 정의함으로써
데이터 입력에 대한 안전성을 높이고자 하였습니다.
배열과 정소는 오버플로우에 대비하여 확인하며,
특히 개발자가 정의하지 않은 배열 값에
승인하지 않은 값들이 주입될 수 없도록 'Array bounds check' 기능을 추가하였습니다.
또한
스위프트는 포인터에 직접 접근하는 시도를 차단하고,
클래스를 통해 간접적으로만 레퍼런스를 참조할 수 있도록 제한했습니다.
ARC(Auto Referencing Counter)를 이용하여 자동으로 메모리를 관리하므로
메모리 누수 현상에 대한 안정성도 높일 수 있습니다.
현대적(Modern)
스위프트는 파이썬 언어에 기반을 둔 읽고 쓰기 쉬운 문법을 택하여,
코드 작성이나 디버깅, 유지보수 과정에서 적은 양의 코드가 사용 됩니다.
손쉬운 유지보수를 위해 헤더 파일 사용 대신 메인 파일에 통합하여 코드를 작성할 수 있도록 설계되었죠.
스위프트는 옵셔널, 제네릭, 클로저, 튜플 뿐만 아니라 현대 프로그래밍 언어의 특성까지도 상당수 포함하고 있습니다.
상호반응(Interractive)
Xcode 6 버전부터 애플은 스위프트 코드의 프로토타이핑을 위하여
플레이그라운드(Playground) 편집기를 제공합니다.
스위프트 코드를 작성하고, 그 결과와 메모리 스택 등의 정보를
즉시 확인 할 수 있어 상호반응적으로 코드를 작성할 수 있으며 디버깅도 무척 쉽습니다.
완전한 플랫폼(Complete Platform)
코코아 프레임워크나 코코아 터치 프레임워크의 모든 API를 스위프트로 호출할 수 있습니다.
오브젝티브-C로 작성되었던 핵심 프레임워크의 모든 라인이
스위프트 언어를 이용하여 거의 모두 재작성되었고,
이는 스위프트만으로 하나의 완전한 앱을 만들 수 있다는 의미 입니다.
통합(Unified)
스위프트는 C언어나 오브젝티브-C 언어를 완전히 대체할 수 있습니다.
스위프트는 객체지향 언어의 특성을 모두 제공하는 동시에
자료형과 흐름 제어, 연산자 같은 저수준 언어의 기본 요소들도 모두 포함합니다.
게다가 하나의 앱 프로젝트에서 오브젝티브-C와 함께 사용할 수 있도록 통합성도 지니고 있습니다.
오브젝티브-C 객체를 스위프트에서 참조할 수 있으며,
각각의 화면 별로 오브젝티브-C 또는 스위프트로 나누어 작성하는 것도 가능합니다.
'IOS > Swift' 카테고리의 다른 글
Swift 자료형 (0) | 2024.02.18 |
---|---|
Swift 변수와 상수 (0) | 2024.02.18 |
Swift 간단 기초 문법 (0) | 2024.02.18 |
Swift 언어의 탄생과 배경 (0) | 2024.02.18 |
앱개발의 Swift(스위프트)가 무엇인가? (0) | 2024.02.18 |