📱 Mobile/🚀 Swift

[Swift] Swift 개요

exception_log 2021. 1. 17. 20:57

<!— 본 포스트는 "꼼꼼한 재은씨의 Swift : 문법편"을 공부하며 직접 정리한 포스트입니다. —>

 

🚀작성자의 Swift 정리 원본인 Notion 구경하기 -> www.notion.so/Swift-59150070adb0467ea11d4f69090dbb24

 

✔️ 첫 장은 Swift 언어의 특징을 간단히 살펴보는 정도로만 공부하였다.

스위프트 언어의 특징

Swift는 개발 생산성과 앱 성능 모두에서 만족할만한 결과를 가져오는 언어로 포지셔닝 되어 있다.

✔️ 스위프트가 파이썬이나 JS 처럼 동적 바인딩을 채용하는 언어는 아니다. **정적 바인딩**을 채용하고 있다.

✔️ 또한 스위프트는 **데이터 타입에 대한 구분이 엄격**하다. 스위프트에서 선언된 변수와 상수는 컴파일 단계에서 데이터 타입이 미리 정의되어 있어야 하고, 일단 변수의 데이터 타입이 정의되면 다른 타입으로 변경할 수 없다. 이와 같은 엄격성을 바탕으로 컴파일러는 타입에 맞지 않는 데이터가 변수에 대입되는 것을 사전에 차단하여 안전성을 높일 수 있다.

✔️ 스위프트는 같은 프로젝트 내에 구성된 객체들은 반입 과정 없이 참조할 수 있다.

스위프트 언어에서 차용하고 있는 주요 기능들

🚀 딕셔너리(해시 테이블) from 자바스크립트, 파이썬

자바스크립트에서는 대괄호 구문을 이용하여 값을 배열로 만들거나 문자열을 입력받는데, 이것이 해시 테이블 역할을 한다. 스위프트도 마찬가지이다. 대괄호를 사용하여 해시 테이블을 만들 수 있다. 애플은 이것을 **딕셔너리**라고 부르며, 초기화 구문을 제공한다.

var airports = [String : String?]()
airports["ICN"] = "Inchon International Airport"

 

🚀 데이터 타입 추론 from 함수형 프로그래밍 언어

변수를 특정 데이터 형식으로 강제하면 코드를 실행해보기 전에 버그를 미리 잡을 수 있어 효율적이다. 컴파일러가 데이터 형식을 확인하고 비호환성이 발견되면 오류를 검출해주기 때문이다.

그러나 최근의 우수한 컴파일러는 **데이터로부터 스스로 형식을 추론**할 수 있으므로 컴파일러가 알아서 변수에 데이터 형식을 지정할 수 있게 되었다.

let meaningOfLife = 42 var abc = "str"

 

🚀 데이터 구조체 타입 선언 from C#과 JAVA

스위프트에서도 데이터 구조체에 저장될 타입을 컴파일러에게 미리 알려줄 수 있다.

var namesOfIntegers = Dictionary<Int, String>()

 

🚀 문자열 템플릿 from 콜드 퓨전, JSP, 파이썬 등

스위프트는 역슬래시와 함께 소괄호를 작성하고, 그 안에 평가할 식이나 변수를 넣어 출력해주는 깔끔한 템플릿 시스템을 제공한다.

let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples"
let fruitSummary = "I have \(apples + oranges) piece of fruit"

 

🚀 선택 사항인 세미콜론 from 자바스크립트와 파이썬

스위프트에서 세미콜론은 라인 끝에 붙일 수 있는 선택 사항이다. 여러 구문을 한 라인으로 묶어야 할 때는 세미콜론이 필요하지만, 각 구문을 개별 라인으로 작성할 때는 입력할 필요가 없다.

 

🚀 프로토콜(인터페이스) from 자바와 C#

자바와 C#에서 정교한 객체지향 클래스 구조체를 만드는 프로그래머는 가장 먼저 기본 인터페이스부터 설계를 시작하는 경우가 많다. 인터페이스는 클래스가 정의에 부합하기 위해 제공해야 하는 모든 함수에 대한 구조를 정의하는 기본 클래스이다. 스위프트는 클래스 모음의 인터페이스에 대해 '프로토콜(Protocol)' 이라는 용어를 사용한다.

protocol ExampleProtocol {
	var simpleDescription : String { get }
	mutating func adjust()
}

 

🚀 튜플(Tuple) from LISP와 파이썬

함수나 메소드에서 가끔 두 개 이상의 값을 반환해야 할 때가 있다. LISP와 같은 초기 언어는 모든 요소를 튜플 목록으로 간주했는데, 파이썬 같은 근래의 언어는 메소드에서 반환되는 N개의 값과 여기에 바인딩되는 N개의 변수를 맞추기 위한 명시적인 구문을 제공한다. 스위프트도 이 방식을 따라 **튜플**을 지원한다.

protocol ExampleProtocol {
	var simpleDescription : String { get }
	mutating func adjust()
}

 

🚀 자동 참조 (가비지 컬렉터와 비슷) from Java, C#, Objective-C

가비지 콜렉터는 메모리를 탐색하면서 더는 사용되지 않는 메모리 영역을 회수하는 자동 루틴으로, 앞 글자를 따서 GC라고 불리기도 한다. 가비지 컬렉터의 결과로 가용 메모리가 다시 늘어나는 장점이 있는 반면, 가비지 콜렉터를 실행하는 동안 프로세스는 원활한 진행을 방해받는다는 단점도 있다.

스위프트는 자동 참조 카운트 (ARC - Auto Referencing Counter) 를 사용하는데, 이는 Objective-C 사용자들 사이에서 널리 사용된 것과 비슷한 솔루션이다. 이 기능은 Objective-C 에서 물려받았다고 할 만한 기능이다.

 

🚀 부호 있는 정수와 부호 없는 정수 from C#과 Objective-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 & 0x0000FF
// blueComponent is 0x99, or 153

 

🚀 클로저(Closure) from Lisp와 스킴에서 자바스크립트까지

자바스크립트에서는 소량의 코드를 묶어서 함수처럼 전달하는 클로저를 사용할 수 있다. 이러한 클로저는 람다 함수 아이디어를 개발한 리스프, 스킴과 같은 언어에서 가져온 것이다. 스위프트는 클로저를 제공할 뿐만 아니라 함수를 1급 객체로 간주하고 인자값으로 함수 자체를 전달하는 기능을 제공한다.

let numbers = [Int]()

numbers.map({
	(number:Int) -> Int in
	let result = 3 * number
	return result
})

 

🚀 멀티 라인 쿼우팅 (Multi-Line Quoting)

파이썬처럼 큰 따옴표를 세 개 겹친 """로 문자열의 시작과 끝을 나타내는 방식으로 우리는 여러 줄의 문자열을 간편하게 입력할 수 있게 되었다. 이는 여러 줄의 문자열을 입력하기 위해 더이상 문자열 내부에 인위적인 줄바꿈 문자('\n')를 넣어주지 않아도 된다는 뜻이기도 하다.

let query = """
	SELECT member_id, member_name, member_level, nick_name
	FROM member
	WHERE login_id = ? AND password = ?
"""

스위프트 언어의 구조적 특징

🚀 빠름 (Fast)

스위프트는 매우 빠른 언어이다. 애플에서는 고성능 앱을 만들기 위해 GCC 대신 LLVM 컴파일러를 사용해오고 있는데, 이 컴파일러에서 제공하는 코드 최적화기를 사용하여 소스 컴파일과 최적화를 수행함으로써 스위프트의 성능을 극대화할 수 있다.

 

🚀 설계에 의한 안정성 (Safety by Design)

스위프트는 언어 차원에서 안전성을 담보하기 위한 설계로 여러 장치를 해 두었다. 변수나 상수는 반드시 선언한 후에 사용하도록 강제하였으며 타입 추론 기능에 의해 변수의 초기값을 기준으로 타입을 정의함으로써 데이터 입력에 대한 안전성을 높이고자 하였다.

스위프트는 포인터에 직접 접근하는 시도를 차단하고, 클래스를 통해 간접적으로만 레퍼런스를 참조할 수 있도록 제한했다. 스위프트는 ARC를 이용하여 자동으로 메모리를 관리하므로 메모리 누수 현상에 대한 안정성도 높일 수 있다. 이렇게 설계 수준에서 안전성을 구현하는 것이 스위프트의 구조적 특징 중 하나이다.

 

🚀 현대적 (Modern)

손쉬운 유지보수를 위해 헤더 파일 사용 대신 메인 파일에 통합하여 코드를 작성할 수 있도록 설계되었다. 스위프트는 Optional, 제네릭, 클로저, 튜플 뿐만 아니라 현대 프로그래밍 언어의 특성까지도 상당수 포함하고 있다.

 

🚀 상호 반응 (Interactive)

XCode의 Playground 편집기를 이용하여 상호반응적으로 코드를 작성할 수 있으므로 코딩의 효율성을 높여준다.

 

🚀 완전한 플랫폼 (Complete Platform)

스위프트만으로 하나의 완전한 앱을 만들 수 있다.

 

🚀 통합 (Unified)

스위프트는 C언어나 Objective-C 언어를 완전히 대체할 수 있다. 스위프트는 객체지향 언어의 특성을 모두 제공하는 동시에 자료형과 흐름 제어, 연산자 같은 저수준 언어의 기본 요소들도 모두 포함한다.

반응형

'📱 Mobile > 🚀 Swift' 카테고리의 다른 글

[Swift] 집단 자료형  (0) 2021.01.20
[Swift] 흐름 제어 구문  (0) 2021.01.19
[Swift] Swift 기본 문법  (0) 2021.01.18
[Swift] 배열, for 루프, while 루프  (0) 2020.12.22
[Swift] 상수와 변수  (0) 2020.12.13