Swift
(♥ 0)
스위프트(swift)라는 이름을 가지는 다른 문서에 대한 내용은 스위프트 문서 참고하십시오.
[각주]
1. 개요[편집]
print("Hello, world!")
// Swift 5로 작성한 "Hello world!"
Apple이 개발한 프로그래밍 언어. '스위프트'라고 읽는다. 2014년 WWDC14에서 공개되었다.
이름의 유래는 신속한, 재빠른이라는 뜻의 영단어인 Swift이다. 로고는 Swift라고 불리우는 칼새[2] 를 상징하는 것으로 추정된다.
기존 Objective-C의 단점을 보완하고, LLVM/Clang[3] 컴파일러로 빌드되는 애플의 신규 프로그래밍 언어이다. 클로저#프로그래밍 용어, 다중 리턴 타입(튜플), 네임스페이스, 제네릭, 타입 인퍼런스 등 Objective-C에는 없었던 현대 프로그래밍 언어가 갖고 있는 기능을 많이 포함시켰으며, 이에 따라 일정한 성능 향상을 보이고 있다. Apple이 만든 언어답게 iOS와 iPadOS, macOS를 대상으로 한다.
2015년 스택 오버플로우 설문조사에서 가장 좋아하는 언어 1위를 달성하였다.
2. 개발 철학[편집]
WWDC에서 공개된 Swift의 특징은 Fast, Modern, Safe, Interactive이었으나, 이후 Safe(안정성), Fast(신속성), Expressive(표현성)로 바뀌었다.
하위 호환성도 어느 정도 보장하고 있어, 코드 내부에서 C나 Objective-C 코드를 섞거나 스크립트 언어처럼 프로그래밍할 수 있게 되어 있다.
오른쪽 사진과 같이 WWDC Keynote에서는 RC4[4] 암호화 속도가 기존 Objective-C 대비 약 1.73배, Python 대비 220배라고 설명하고 있다. 하지만 Python은 일부러 다중 멀티스레드로 비교해서 싱글스레드 위주의 Python을 느리다고 까고 있으므로 저건 믿을 게 못 된다. 그냥 Swift가 멀티스레드 환경에 잘 최적화되어있다는 뜻으로 이해하자.
Swift의 개발자인 크리스 래트너[5] 본인이 직접 언급한 영향을 준 언어로는 Rust, Haskell, C\#, Python, Ruby 정도가 있다. 그 외 Kotlin 같은 언어의 영향도 물론 있겠지만, 여러 가지를 봤을 때 가장 강력한 흔적을 남긴 건 역시 Rust다. Rust에 C#을 가미해서 Apple 입맛으로 조리한 느낌. 사실 Kotlin도 위 언어들에서 영향을 받아 비슷한 방향으로 수렴 진화했다고 보는 게 맞다. Kotlin과의 차이점이라면 Objective-C 기반 파생과 Java 기반 파생이라는 것 정도.
그 밖에도 Apple에서 Swift 보급을 위해 노력하는 모습이 보인다.
2015년 6월 8일, WWDC15에서 Swift의 차기 버전이 발표되었으며, 소스를 공개한다고 발표했다.
OS X, iOS, Linux용으로 같은 해 가을에 배포될 예정이다. Swift 2에서는
do
/try
/catch
/throw
등 에러 확인 구문이 추가되었고, println()
함수가 print()
로 대체되었다.2015년 12월 4일 오픈 소스로 공개되었다. 2.2 및 3.0 개발버전이 배포중이며, OS X, iOS, watchOS, tvOS, Ubuntu LTS/일반 버전[6] 을 지원하고 있다. 아파치 라이선스 2.0으로 개발자, 교육자, 학생 등 모두에게 열려있다. Apple은 iOS, OS X, watchOS, tvOS, 그리고 Linux용 코드를 처리할 수 있는 OS X 및 Linux용 바이너리를 제공하고 커뮤니티를 개설해 사용자들이 Swift 소스 코드 개발에 직접 참여할 수 있도록 했다.
IBM은 서버사이드에서 Swift를 적극적으로 지원하고 있다. IBM은 Swift를 리눅스 서버에서 실행하여 브라우저에서 볼 수 있고 다른 사람과 공유할 수 있는 IBM Swift Sandbox라는 것을 발표했으며[7] , 자사의 클라우드 컴퓨팅 플랫폼인 Bluemix에서도 Swift를 지원하고 있다. 또한, Microsoft Windows용 컴파일러도 5.3 버전과 함께 공개했다. # 현재 Swift는 macOS 환경에서 iOS용 앱을 개발하는 데 주로 쓰인다.
다음은 Apple 개발자 홈페이지에 나와있는 기타 사항이다. 원문 한국
3. Objective-C와의 관계[편집]
Swift의 등장으로 많은 사람들이 기존의 Objective-C가 조만간 역사속으로 묻혀질 것으로 전망하였지만, 실제로는 그렇지 않다.
Swift의 하위호환으로서 Objective-C는 계속 지원되며, Swift언어로 구성된 프로젝트 내부에서 Objective-C 소스코드 파일을 아래 소항목의 추가방법과 같이 추가하면, 아무런 제약 없이 서로의 객체이름을 부르며 자유롭게 사용 가능하다(!!). Swift의 컴파일러 백엔드와 Objective-C의 컴파일러 백엔드는 둘다 LLVM으로 동일하며, 어떤 언어를 사용해서 코드를 작성하더라도 같은 형태의 중간언어로 번역되어 컴파일 된다.
실전에서 Swift를 사용하다 보면 기존의 Objective-C로 작성되어 있는 기존의 라이브러리를 사용하기 위해서라도 개발도구 입장에서 Objective-C를 반쯤 현역으로 사용하게 된다. 프로젝트 내에서 대부분의 코드는 Swift로 작성되지만, Objective-C 기반으로 작성되어 있는 기존 코드가 상당수이기 때문에, Swift가 정착된 후에도 한동안 Objective-C의 사용은 계속될 것으로 보인다.
물론 기존의 것이라서 지원할 뿐이고, 현재 Apple에서는 Swift를 밀고 있기 때문에 Apple 계열의 많은 라이브러리가 Swift로 재번역되거나 새로운 라이브러리는 아예 Swift로만 작성되고 있으며, Objective-C로 작성된 라이브러리라고 해도 Xcode 등의 IDE가 Swift에서 바로 사용할 수 있도록 적절히 처리해주기 때문에, Objective-C로 만들어진 라이브러리를 직접 수정할 일만 없다면 Objective-C를 전혀 몰라도 Swift로 작성하는데에 아무런 문제가 없다. 굳이 신규 프로젝트를 Objective-C로 진행하는 경우는 거의 없으므로 Swift를 주력 언어로 사용한다면 Objective-C는 코드 리딩 정도만 할 줄 알면 충분하다. (어차피 Swift나 Obj-C나 Cocoa Framework 기반이라 코드 리딩을 위해 별도로 공부할 필요도 없다.)
3.1. Objective-C 파일 사용 방법[편집]
Xcode의 Swift 프로젝트 내에서 Objective-C (.m) 파일을 만들게 되면 유저에게 물어본 후, Bridging-header.h 파일을 만들어주게 된다. 이 파일 안에, 자신이 만든 헤더파일들을 import 해주면 Swift 코드에서도 사용이 가능해진다.
4. 버전[편집]
4.1. Swift Playgrounds[편집]
Swift 언어를 사용하는, iPad를 위한 개발도구이다. WWDC16에서 최초로 공개되었으며, 가격은 무료이다. 학생들은 물론 어느 누구나 쉽게 프로그래밍을 배울 수 있게 하고자 개발된 앱이다. 아쉽게도 iPhone용 앱은 없으며, 지속적으로 업데이트 및 기능이 추가되는 중이다. 2.2 버전에서는 한글화도 꽤 진행되었다. iPadOS 15에서는 iPad의 Switft Playgrounds앱 하나만으로 Mac의 도움 없이 iOS/iPadOS용 앱을 개발해서 테스트하고 앱스토어에 등록하는 것까지 가능해진다고 한다. #
Apple에서 지대한 관심을 가지고 있는지 매년 Swift Playgrounds에 대해 안내하고 있다.
[ 관련 영상 보기 · 접기 ]
4.2. Swift 3[편집]
Swift 3.0 릴리즈 노트를 보면 Swift 개발팀의 계획을 대략 짐작할 수 있다. 먼저 바이너리 인터페이스(binary interface)의 안정화다.[10] 이를 통해 Swift가 바이너리 레벨에서 여러 운영체제에서 실행될 수 있도록 지원할 것으로 보인다. Swift의 활용 범위가 그만큼 넓어지는 셈이다.
제네릭도 개선된다. 라이브러리 전반에 걸쳐 제네릭을 사용해 Swift 3.0에서는 제네릭 사용이 완성될 것으로 보인다. 타입 시스템 클린업과 문서화도 주목된다. 개발팀은 Swift 3.0에서 "다양한 서브 타이핑, 타입 시스템의 전환 규칙, 컴파일러 타입 체커 내에서의 구현 등을 재검토하고 문서화 할 것"이라고 예고했다. 그리고 Firefox 엔진을 위해 개발한 Rust 언어의 Ownership 기반 메모리 관리 모델이 개발자들 사이에 호평이 높아지자 이를 적극적으로 도입할 것이라고 한다.
정제와 집중 측면도 있다. 이 부분에 대해서는 자세한 정보가 부족하지만, 개발팀은 관련 문서를 통해 "그동안 Swift는 빠른 발전을 거듭해 왔고 이 과정에서 언어 전체와 잘 맞지 않는 기능이나 라이브러리 API가 추가됐다"며 "Swift 3.0은 이런 부분을 제거하거나 개선해 Swift의 전반적인 일관성을 개선할 것"이라고 설명했다. 또한, Swift 3.0에서는 API 개발자를 위한 새로운 디자인 지침이 나올 것으로 보인다.
4.3. Swift 4[편집]
2017년 9월 19일, Xcode 9에 포함되어 새롭게 등장한 Swift이다.
인간으로 비유하자면 Swift 3까지는 영유아기, Swift 4부터는 청소년기로 생각해도 좋을 것 같다. Swift 4 컴파일러는 Swift 3, Swift 4, 혼합 모드 3가지를 지원하는데 이것은 Swift 3에서 4로 이동하는 것을 사용자 마음대로 할 수 있게 되는 것이다. Apple은 이에 대하여 "Swift 3는 소스 수준 안정성을 고려하여 언어를 설정했으며, 이제 Swift 4는 앞으로 발전시켜 나갈 기능으로 소스 호환성을 제공합니다."라고 설명하고 있다. Swift 3에서 이미 언어가 완성되었고, Swift 4는 일종의 확장팩인 셈이다.
2018년 3월 29일 Swift 4.1이 출시되었고, 동년 7월 11일을 기준으로 Swift 4.2가 개발중이다. 2014년 공개 이후로, 2015년 Swift 2, 2016년 Swift 3, 2017년 Swift 4가 차례로 나오다가 2018년에는 Swift 4.2가 공개되었다. 확실히 애플도 속도를 늦추고 있는 모습이다.
4.3.1. 새로운 기능[편집]
4.4. Swift 5[편집]
이미 Swift 4부터 페이즈가 느려졌고, 그 이유가 언어가 어느 정도 완성되었기 때문인 만큼, Swift 5에서는 꽤나 많은 기능이 추가될 것으로 예상된다.
2019년 3월 25일, Swift 5가 릴리스되었다.
5. The Swift Programming Language[편집]
Apple Books에서 구할 수 있는 Swift 공식 레퍼런스 가이드이다.
양이 꽤 방대한데, 처음 60페이지 정도의 A Swift Tour만 읽어도 언어를 이해하는데 도움을 받을 수 있다. 그러다 문제가 생기거나, 더 자세히 알고 싶다면 Language Guide를 읽게 되는데, 이게 약 900페이지의 분량이다. 그밖에도 정말 사소한 부분까지 궁금하다면 Language Reference, 옛 버전과 현재 버전 사이에 어떤 변화가 있었는지 궁금하다면 Revision History를 읽어보자.
6. 문제점[편집]
Objective-C에 비해 문제가 있었는데 초기 3년 동안에 엄청난 속도로 업데이트를 하면서 언어동작, API가 계속 바뀌었다. 그리고 이에 따른 고생은 전부 프로그래머의 몫이다. Swift 2 기반으로 코드를 다 짜 놓았는데 Swift 3.0이 배포되며 코드가 싹 다 바뀌었고, 4.0에서 또 바뀌어 버려서 코드를 하나하나 수정해 주어야하는 일이 발생한 것. 대표적인 문제로 Swift 3.0에 오면서 조금만 큰 프로젝트를 개발하다 보면 Code Completion 기능은 먹통이 된다. 이 부분에 대해서 Apple은 Swift 4 또는 4.2[12] 로 마이그레이션할 수 있도록 가이드를 제공하고 있다. Migration to Swift 4 Migration to Swift 4.2
LLVM/Clang의 아름다운 실시간 오류 검출 기능은 Xcode의 컨디션에 따라서 나왔다 말았다 한다. 이미 Apple 개발자 포럼에는 이와 관련된 문제가 많이 보고되고 있다. Swift 초창기 2.0과 3.0에서 특히 심했으며, Swift 4.2 업데이트 이후부터는 조금 안정된 모습을 보인다.
- 컴파일 속도
Objective-C에 비해서 빌드 속도가 현저히 느려졌다. 빌드 타임에 작성된 코드를 Swift로 변경하고 다시 그걸 컴파일하는 듯한 속도감을 보인다.
- Xcode의 전반적인 반응 속도
Xcode를 사용하면서 Swift 3.0으로 올리고 나서 CPU 사용을 계속적으로 full로 사용하여 전반적인 동작이 느려지는 문제가 나왔다. Objective-C에서 나온다는 보고는 아직 없다. #
- 문자열 조작
문법의 가독성 부분에서 인터프리터 계열 언어 Python의 영향을 받은 것이 무색하게 문자열 조작이 무지하게 불편하다. 유니코드 때문에 실제로 글자 1자가 일정한 바이트 수가 아닌건 이해가 가지만 이 불편함을 좀 감출 문법적 설탕도 없다. 예를 들어서 어떤 문자열의 인덱스 범위
[4, 8)
에 해당하는 부분 문자열을 짤라오고 싶다면 다음과 같은 걸 해야한다.[13]let text = "The Swift Programming Language"
let subText = text[text.index(text.startIndex, offsetBy: 4)..<text.index(text.startIndex, offsetBy: 8)]
// subText == "Swif"
- 애플 생태계 한정
태생이 애플 MacOS/iOS이고 개발도 막장 IDE의 끝판왕으로 유명한 Xcode 환경 중심이다 보니 이용도 주로 애플 생태계로 한정되고 있어서 윈도우나 리눅스 같은 인기있는 플랫폼이나 개발환경 에서 이용이 매우 저조하다. 컴파일러 디버거 등 기본적인 도구는 있지만 개발환경이나 서드파티 라이브러리나 개발 정보등 이미 자리를 잡은 C# 등의 언어에 현저히 뒤지고 있어서 아직 접근성에서 떨어지고 사용이 매우 불편하다. Rust 나 Haskell 같은 신생 비인기 언어도 공식지원하는 SDL 같은 인기 라이브러리도 스위프트 언어 바인딩을 공식지원을 하고있지 않다. 아직 IntelliJ CLion 등 서드파티 개발환경 지원도 매우 미지근하다. 개발자 평균/중간연봉에서도 C++/Java 프로그래머보나 약간 높은 정도에 불과하고 Go 나 파이선/루비 개발자보다 상당히 낮다. 개발자 채용 수요도 Go 나 파이선 루비 구인수요보다 압도적으로 적다. 그만큼 수요나 이용이 저조하다는 것. 윈도우나 리눅스 환경에서 스위프트 언어로 개발하는 것은 아직은 스스로 엄청난 개척의 고난을 자초하는 일이라 새로운 신규 개발을 스위프트로 할 이유는 전혀 없고 단지 원래 애플 생태계에서 스위프트로 개발된 성숙한 프로그램이나 게임을 윈도우로 이식하기 위해 어쩔 수 없이 써야 하는 경우 뿐이나 이에 해당하는 경우는 극단적으로 낮고 2020년대의 플랫폼 개발도 네이티브가 아닌 멀티플랫폼 프레임워크를 이용하는 경우가 많은데 swift를 쓰는 멀티플랫폼 프레임워크가 없어 점점 사용처가 줄어들고 있다.
- 사용처 부족
특정 생태계에 묶여있는 언어라고 해도 다양한 용도로 사용이 가능하거나 대중적으로 인기를 끌만한 프레임워크 등과 같이 쓸수 있다면 언어 자체의 인기도 늘어난다.[14] 하지만 Swift는 iOS, Mac 개발을 제외하면 사용처 자체도 전멸했으며 Apple 이 새로운 사용처를 개척하려고 하는 시도조차 하지 않는다.[15] 이러다 보니 Swift가 필요한 직종 자체도 매우 제한적이라 결과적으로 Swift 수요와 사용 가능한 개발 인력 수는 점차 줄어드는 상황이다. 관련 통계(2023년 기준) 또한 AI나 각종 신기술 접목 등도 거의 이루어 지지 않다 보니 연구 목적으로도 건드는 사람이 없어 장기적으로 봤을때 암울하기만 하다.
7. 개발 환경[편집]
Swift 언어를 공식적으로 지원하는 통합 개발 환경으로는
8. 미래[편집]
데스크탑 OS를 대부분 점령한 마이크로소프트가 적극 지원하는 C\#이나 DBMS 업계의 최강자 오라클이 적극 지원하는 Java[17] 처럼 애플이 적극적으로 밀어주고 있어서 재벌 아버지를 둔 금수저 외아들처럼 태어나자마자 이미 성공을 보장받아 잘 나가고 있다. 거기다 잘 안된다 싶으면 바로 내쳐버리는 곳과는 달리, Apple은 한번 밀기로 작정하면 20년 30년 동안 꾸준히 밀어준 역사가 있어서, 다들 묻지도 따지지도 않고 한마음으로 Swift로 달려갔다.
2018년 7월 기준으로 등장한지 4년이 조금 넘었고 주로 iOS 개발에서만 쓰이고 있으나, 프로그래밍 언어 월간 점유율 순위에서 기존에 iOS 및 macOS 개발용으로 널리 쓰이던 Objective-C는 10등, Swift는 11등을 차지하고 있다. 점유율 차이는 0.041%p로, 사실상 동급에 랭크되고 있다. 2021년 1월 기준으로 Swift는 Objective-C를 제치고 TIOBE 순위 13위에 올랐다. (Objective-C는 18위로 하락) 레거시 코드 때문에 Objective-C가 당장 버려지지는 않겠지만 iOS의 미래는 Swift라는 걸 몸소 증명하는 중이다.
심지어는 경쟁사인 구글도 Java API 저작권을 둘러싼 오라클과의 분쟁의 영향으로 안드로이드의 언어를 Swift로 전환할 지 고려 중이라는 소문이 나왔을 정도. 물론 이건 안드로이드의 Java 생태계를 포기하는 것과 마찬가지라서 어느 정도 무리가 있는 이야기였고, 결국 Google I/O 2017을 통해 Java와 동일한 JVM 언어인 Kotlin을 공식 언어로 발표하였다. 그이후 구글은 다트와 플러터를 밀고 있다. 구글의 차세대 OS인 퓨시아에서 Swift 코드가 일부 구동될 수 있도록 준비 중이라고 한다. #
Java와 C#은 매우 뛰어난 언어이고 인기도 높지만, 가상머신 상에서 바이트코드로 실행되는 언어라 실행 속도 면에서 태생적 약점이 있는데, Swift는 Java와 C#의 장점을 거의 다 가지고 있으면서도 LLVM을 기반으로 C/C++/Objective-C처럼 기계어로 최종 번역된다는 점에서 일단 성능상의 우위가 있다. Rust에게서 영향을 가장 많이 받았다지만 Rust만의 소유권이나 수명과 같은 시스템은 Swift에서 찾아볼 수 없고, 엄연히 C와 Java 계통의 대중적인 행보를 이어가고 있다. 자세한 것은 Rust 문서 참고. 이와는 별개로, Kotlin은 JVM 언어이기는 하지만 LLVM을 이용한 네이티브 컴파일도 가능하다. 이쪽도 구글의 지원에 힘입어 Swift 못지않게 빠른 점유율 상승을 보이고 있다. Java/C#의 장점과 C/C++/Objective-C의 장점의 행복한 결합. 다만 Apple이 모바일에서는 2인자여도 데스크탑과 서버 시장에서는 존재감이 미미하기 때문에 Mac을 제외한 데스크톱 시장에서의 보급에는 한계가 있다. 추후 애플의 동향이 주목되는 부분.
하지만 애플이 타 플랫폼에 대해 줄창 폐쇄적인 입장을 유지하고 있어서 2020년 기준으로는 사실상 iOS 빼면 쓰이지 않는 실패한 언어라는 평가가 많으며 최근(2023년) 통계에 따르면 스위프트를 주력으로 개발하는 개발자의 수보다 어셈블리를 이용해 개발하는 개발자 비중이 더 높다는 충격적인 결과가 나오기도 했다. 이유는 크로스 플랫폼 프레임워크가 대두되는 반면에 Swift는 iOS, Mac 개발 외에는 용도 자체가 없고[18] Swift의 장점도 Java나 C#등이 대부분 따라잡았고[19] 훨씬 다양한 분야에 쓸수 있다는 점이 점점 부각되고 있기 때문이다.
9. 학습[편집]
10. 관련 문서[편집]
이 문서의 내용 중 전체 또는 일부는 2024-08-15 03:16:12에 나무위키 Swift 문서에서 가져왔습니다.
[1] Apple 소프트웨어 엔지니어링 수석부사장[2] 제비가 아니다.[3] 정확히 말하자면 기존의 LLVM/Clang을 Apple이 내부적으로 변형한 버전이다.[4] Wikipedia(영어)[5] LLVM 컴파일러의 주요 저자인 그 사람 맞다.[6] 2015년 오픈 소스화 작업과 함께 우분투로의 포팅도 이루어졌다.[7] 2018년 1월에 서비스를 종료했다. 출처[8] Apple 공식 헤드라인. 원문 한국[9] Apple 개발자 웹사이트 공식 헤드라인. 원문 한국[10] 크리스 래트너는 최근 메일링에서 이 목표는 3.0 릴리즈에 포함되지 못한다고 밝혔다.[11] Apple 개발자 웹사이트 공식 헤드라인. 원문 한국[12] 2018년 7월 기준, 아직 개발중이다. macOS Mojave 및 Xcode 10과 함께 배포될 것으로 보인다.[13] 여러번의 문자열 조작이 필요한 경우 String 클래스 extension으로 인덱스 범위를 잘라내는 함수를 추가하여 사용하는것이 좋다. (참고: https://stackoverflow.com/a/52011572/22175245)[14] 전자는 MS가 관련 프로젝트를 오픈소스로 공개하고 ASP .NET CORE, Blazor, MAUI등으로 사용처를 계속 만들어내는 C#이고 후자는 핫한 Flutter 하나만 믿고 가는 Dart다.[15] 이는 애플이 자사 개발자 컨퍼런스인 WWDC에서 Swift만의 별도 세션을 만드는게 아니라 대충 다른 발표에 끼워넣는 모습에서도 드러난다. Java개발 주체인 오라클이 별도의 날자를 잡아서 자바 세션만 따로 다루거나 아예 닷넷 재단에서 MS와는 별개의 자체 언어관련 컨퍼런스를 여는 닷넷 계열 언어와 대비된다.[16] 플러그인 설치 시 지원[17] 그러나 오라클이 Java를 내치려는 정황이 나오고 있다.[18] 반면에 비슷하게 윈도 플랫폼에 종속되었다는 이미지가 강한 C#은 MS가 .NET 관련 구성품을 오픈소스로 개방함과 동시에 Blazor나 MAUI등등 C#을 활용할 여러가지 방법을 개발하는데 적극적이라 Java와 비슷한 급의 메이저 언어로 자리잡는데 성공했다.[19] 네이티브로 컴파일 되어 더 빠르다는 점은 AOT 컴파일 기능이 직접적인 지원으로 해결되었다.