1. 스위프트 주요 기능
딕셔너리(해시 테이블) - 자바스크립트,파이썬
스위프트는 자바스크립트, 파이썬과 같이 대괄호 구문을 이용하여 값을 배열로 만들거나 문자열로 입력받는 방법을 사용하여 *해시 테이블을 만들 수 있다. 애플에서는 이것을 딕셔너리(Dictionaries)라고 부르며, 초기화할 수 있는 구문을 제공한다.
📝 Hash table(hash map)이란 해시함수를 사용해서 변환한 값을 index로 삼아 key와 value를 저장하는 자료구조
var airports = [String : String?] ()
airports["ICN"] = "Inchon International Airport"
// If close "Inchon International Airport", then delete it"
airports["ICN"] = nil
// ICN has now benn removed from the dictionary
데이터 타입 추론 - 함수형 프로그래밍 언어
프로그래머 관점에서 변수를 특정 데이터 형식으로 강제하면 코드를 실행해 보기 전에 버그를 잡을 수 있어 효율적이다.
📝 컴파일러가 데이터 형식을 확인하고 비호환성이 발견되면 오류를 검출해 주기 때문이다.
우수한 컴파일러들은 데이터로부터 스스로 형식을 추론할 수 있음으로 컴파일러가 알아서 변수에 데이터 형식을 지정할 수 있게 되었다.
데이터 타입은 강하지만, 데이터 타입을 생략할 수 있다는 장점.
📝 ML과 같은 함수형 언어부터 시작, 이후 하스켈, 스칼라, 오파 등의 언어에도 등장, 마이크로소프트까지 추론기능을 닷넷에 추가, 이제는 주류기능이라 할만하다.
let value = 58
// value is inferred to be of type Int
데이터 구조체 타입 선언 - C#과 자바
프로그래머가 *HashMap(해시 테이블), *Array(배열) 또는 *Collection에 넣을 데이터 형식을 컴파일러에게 미리 알릴 수 있도록 지원한다.
일반적으로 제네릭 타입은 '<'와'>' 기호를 이용하여 데이터 구조체에 저장될 형식을 지정하곤 한다.
스위프트도 이와 동일한 방법으로 데이터 구조체에 저장될 타입을 컴파일러에게 미리 알려줄 수 있게 되었다.
📝 배열(Array)은 연관된 데이터를 모아서 관리하기 위해서 사용되는 데이터 타입, 변수가 하나의 데이터를 저장하기 위한 것이라면 배열은 여러 개의 데이터를 저장하기 위한 것
📝 자바에서 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미
var namesOfIntegers = Dictionary<Int, String>()
// namesOfIntegers is an empty Dictionary<Int, String>
문자열 템플릿 - 콜드 퓨전, JSP, 파이썬 등
요즘 프로그래머가 하는 일 대부분은 문자열을 이어 붙이는 작업.
편의를 위해 많은 프로그래밍 도구들이 변수값을 문자열 템플릿에 삽입하는 기능을 제공한다.
콜드 퓨전(Cold Fusion), 자바 서버 페이지(JSP , Java Server Page), 파이썬 서버 페이지(PSP, Python Server Page)와 같은 웹 도구들은 오래전부터 데이터와 HTML을 템플릿에 혼합하는 간편한 방법을 제공해 왔다.
스위프트는 역슬래쉬와 함께 소괄호를 작성하고, 그 안에 평가할 식이나 변수를 넣어 출력해 주는 깔끔한 템플릿 시스템을 제공한다.
3번의 부가적인 키 입력으로 문자열 템플릿을 제공하는 이 방식은 아마 같은 기능을 수행하기 위한 키 입력 중에서는 가장 적은 수 일 것.
let apples = 5
let oranges = 7
let appleSummary = "I have \(apples) apples"
let fruitSummary = "I have \(apples + oranges) piece of fruit."
선택 사항인 세미콜론 - 자바스크립트, 파이썬
세미콜론( ; ) 은 한 행의 구문이 끝났음을 알려주는 간편한 방법이지만, 어떤 이유에선지 세미콜론을 입력하기 싫어하는 개발자 수가 늘어나는 거 같다. ( 물론 본인도 포함. 빼먹어서 오류 뜨면 매우 화남...😥 )
스위프트에서 세미콜론은 라인 끝에 붙일 수 있는 선택사항이다. 여러 구문을 한 라인으로 묶어야 할 때에는 세미콜론이 필요하지만, 각 구문을 개별 라인으로 작성할 때는 세미콜론 기호를 입력할 필요가 없다.
프로토콜(인터페이스) - 자바, C#
인터페이스는 클래스가 정의에 부합하기 위해 제공해야 하는 모든 함수에 대한 구조를 정의하는 기본 클래스다.
스위프트는 클래스 모음의 인터페이스에 대해 '프로토콜(Protocol)'이라는 용어를 사용한다.
protocol ExampleProtocol {
var simpleDescription : String { get }
mutating func adjust()
}
튜플(Tuple) - 리스프, 파이썬
메서드에서 반환되는 N개의 값과 여기에 바인딩되는 N개의 변수를 맞추기 위한 명시적 구문을 제공한다.
스위프트도 이 방식을 따라 튜플을 지원한다.
func getGasPrices() -> (Double, Double, Double) {
return (4.75, 6.23, 9.54)
}
getGasPrices()
자동 참조(가비지 콜렉터 비슷함) - 자바, C#, 오브젝티드-C
스위프트는 자동 참조 카운트(ARC - Auto Referencing Counter)를 사용하는데, 이는 오브젝티드-C 사용자들 사이에서 널리 사용된 것과 비슷한 솔루션이다. 이 기능은 오브젝티드-C에서 물려받았다고 할 만한 기능이다.
부호 있는 정수와 부호 없는 정수 - C#, 오브젝티드-C
자바와 같은 일부 추상적 언어는 부호 없는 정수와 복잡성을 회피했지만, C# 언어는 이를 수용했다.
스위프트 역시 1, 2, 4, 8바이트의 부호 없는 정수와 부호 있는 정수를 제공한다.
let pink = UInt32 = 0xCC6699
let redComponent = (pink & 0xFF0000) >> 16
// redComponent is 0xCC, or 204
let greenComponent = (pink & 0x00FF00) >> 8
// greenComponent is 0x66, or 102
let blueComponent = pink & 0x000FF
// blueComponent is 0x99, or 153
클로저(Closure) - 리스프와 스킴에서 자바스크립트까지
자바스크립트 프로그래머는 소량의 코드를 묶어서 함수처럼 전달하는 클로저를 사용할 수 있다.
이러한 클로저는 람다 함수 아이디어를 개발한 리스프, 스킴과 같은 언어에서 가져온 것.
스위프트는 클로저를 제공할 뿐만 아니라 함수를 1급 객체로 간주, 인자값으로 함수 자체를 전달하는 기능을 제공한다.
📝 클로저라는 기능을 오늘 공부하면서 처음 알았다... 따로 한번 더 공부해서 올려봐야겠다🥹
let numbers = [Int]()
numbers.map({
(number:Int) -> Int in
let result = 3 * number
return result
})
멀티 라인 쿼우팅(Multi-Line Quoting)
스위프트 4.0 이후, 파이썬의 멀티 쿼우팅 문법을 거의 그대로 도입하였다.
파이썬처럼 큰따옴표를 세 개 겹친 """로 문자열의 시작과 끝을 나타내는 방식으로 우리는 여러 줄의 문자열을 간편하게 입력할 수 있게 되었다. 이는 여러 줄의 문자열을 입력하기 위해 더 이상 문자열 내부에 인위적인 줄 바꿈 문자('\n')를 넣어주지 않아도 된다.
let query = """
공공돌 블로그 입니다.
여기는 메모장 공부해서 올리는 공간!!
멀티 라인 쿼우팅 설명 중 입니다.
"""
2. 구조적 특징
빠름(Fast)
스위프트는 매우 빠른 언어로, 벤치마크에서 볼 수 있듯이 복합정렬 연산에서 오브젝티브-C보다 더 빠른 성능을 나타낸다.
애플에서는 고성능 앱을 만들기 위해 GCC 대신 LLVM 컴파일러를 사용하고 있는데, 이 컴파일러에서 제공하는 코드 최적화기를 사용하여 소스 컴파일과 최적화를 수행함으로써 스위프트의 성능을 극대화 할 수 있다.
설계에 의한 안전성(Safety by Design)
배열과 정수는 오버플로우에 대비하여 확인하며, 특히 개발자가 정의하지 않은 배열 값에 승인하지 않은 값들이 주입될 수 없도록 Array bounds check 기능을 추가하였다. 여기에 더하여 포인터에 직접 접근하는 시도는 차단하고, 클래스를 통해 간접적으로만 레퍼런스를 참조할 수 있도록 제한하였다. 스위프트는 ARC(Auto Referencing Counter)를 이용하여 자동으로 메모리를 관리하므로 메모리 누수 현상에 대한 안전성도 높일 수 있다.
설계 수준에서 안전성을 구현하는 것이 스위프트의 구조적 특징 중 하나
현대적(Modern)
스위프트는 파이썬 언어에 기반을 둔 읽고 쓰기 쉬운 문법을 채택했다.
그 결과, 코드 작성이나 디버깅, 유지보수 과정에서 기존의 오브젝티브-C보다 훨씬 적은 양의 코드가 사용된다.
손쉬운 유지보수를 위해 헤더파일 사용 대신 메인 파일에 통합하여 코드를 작성할 수 있도록 설계가 되었다.
스위프트는 옵셔널(Optional), 제너릭(Generics), 클로저(Closure), 튜플(Tuple)뿐만 아니라 현대 프로그래밍 언어의 특성까지 포함.
상호반응(Interactive)
Xcode 6 버전부터 애플은 스위프트 코드의 프로토타이핑을 위해 플레이그라운드(Playground) 편집기를 제공.
코드를 작성하고, 그 결과와 메모리 스택 등의 정보 확인을 즉시 확인할 수 있어 상호 반응적으로 코드를 작성할 수 있으며 디버깅도 매우 쉽다. 이러한 특징은 스위프트를 이용한 코딩의 효율성을 한껏 높여준다.
완전한 플랫폼(Complete Platform)
단순히 보조적인 수준으로만 스위프트를 사용할 수 있는 것이 아닌, 코코아 프레임워크나 코코아 터치 프레임워크의 모든 API를 스위프트로 호출할 수 있다. 오브젝티브-C로 작성되었던 핵심 프레임워크의 모든 라인이 스위프트 언어를 이용하여 거의 재작성되었고, 오브젝티브-C 코드에 의존하지 않고도 프로그램을 작성할 수 있다는 것은 애플에 의해 널리 알려진 사실이다.
스위프트만으로 하나의 완전한 앱을 만들 수 있다는 의미.
통합(Unified)
스위프트는 객체지향 언어의 특성을 모두 제공하는 동시에 자료형과 흐름 제어, 연산자 같은 저수준 언어의 기본 요소들도 모두 포함한다.
하나의 앱 프로젝트에서 오브젝티브-C와 함께 사용할 수 있도록 통합성을 지니고 있다.
오브젝티브-C 객체를 스위프트에서 참조할 수 있으며, 각각의 화면별로 오브젝티브-C 또는 스위프트로 나누어 작성하는 것이 가능하다.
'메모장' 카테고리의 다른 글
Swift 변수와 상수 1 (1) | 2023.03.02 |
---|---|
Swift 반복문 [ while 편 ] (5) | 2023.02.28 |
Swift 반복문 [ for - in 편 ] (5) | 2023.02.27 |
Swift 와 Objective-C 차이 (4) | 2023.02.27 |
Swift 언어의 탄생과 배경/특징 (4) | 2023.02.26 |