
Swift는 Apple이 개발한 프로그래밍 언어로, '신속한, 재빠른'이라는 의미를 갖습니다. iOS, macOS, watchOS 등 다양한 플랫폼의 애플리케이션을 개발할 때 사용됩니다. iOS에 여러 버전이 있듯이 Swift에도 버전이 있습니다. 2024년 7월 17일 기준 최신 버전은 Swift 6-Beta입니다 (현재는 Swift 5.10).
Swift의 주요 장점 중 하나는 그 문법입니다. 기존의 프로그래밍 언어들은 불필요한 세미콜론(;)이나 괄호를 사용했으나, Swift는 이를 생략하여 가독성을 높였습니다. 함수와 메소드의 이름도 용도를 직관적으로 알 수 있게 지어져 있어, 사람이 읽기 쉽고 간결합니다. 이는 개발자가 코드를 작성하고 유지보수하기 쉽게 만듭니다. 또한, 컴파일 시간에 오류를 잡아내기 때문에 런타임 오류가 줄어들면서 앱의 버그나 크래시가 감소합니다. 이로 인해 앱이 더 안정적이 되어 사용자 경험이 향상됩니다.

Apple에서 설명하는 Swift의 세 가지 주요 특징은 Safe(안전성), Fast(신속성), Expressive(표현성)입니다. 문법이 간결하고, 개발 중에 오류를 잡아낼 수 있어 더 안정적으로 개발이 가능합니다. Swift는 오픈 소스로 공개되어 있습니다.
Apple의 다양한 OS를 개발할 때 있어서 다른 C나 Objective-c 언어보다 성능이 빠르고, Apple에서 Swift 베이스의 다양한 라이브러리와 프레임워크를 제공하기 때문에 다양한 애플리케이션 개발이 더 수월해집니다.
"Swift는 명령형, 객체지향, 함수형, 프로토콜 지향 프로그래밍 패러다임을 모두 지원합니다."
스위프트에서 가장 강조하는 부분은 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍 패러다임C : 명령형 프로그래밍 패러다임
C++, JAVA : 다중 프로그래밍 패러다임 (명령형 + 객체지향)
Swift : 다중 프로그래밍 패러다임 (명령형 + 객체지향 + 함수형 + 프로토콜 지향)

Delegate는 특정한 규약(protocol)을 준수하는 객체를 의미합니다. Protocol 구현을 통해 사용자가 정의한 이벤트를 처리하거나, ViewController 간의 데이터 통신, 그리고 비동기 작업 완료 시 해당 결과를 다른 객체에 알릴 때 사용됩니다. 대표적으로 UITableViewDelegate 프로토콜을 구현하여 테이블 뷰의 데이터 소스를 정의하고, 목록 클릭 이벤트를 처리하는 역할을 합니다.
(UITableView: 하나의 열에 여러 개의 행들을 이용하여 데이터를 나타내는 뷰)
(UITableViewDelegate: 테이블 뷰의 동작을 제어하고, 사용자 상호 작용을 관리하는 데 사용되는 프로토콜)
Optional은 데이터 타입의 한 종류로, 값이 '존재할 수도 있고, 존재하지 않을 수도 있다'를 나타내기 위한 타입입니다. 이를 통해 값이 없는 상황에서 발생할 수 있는 오류를 예방할 수 있습니다. 예를 들어, 금융 애플리케이션에서는 일부 거래 정보가 누락될 수 있는데, Optional 타입을 사용하여 거래 정보가 있는지 확인하는 과정을 거칠 수 있습니다.
Extension은 기존의 Class, Struct 등의 타입에 새로운 기능을 추가하는 방법입니다. 새로운 변수나 메소드를 추가하거나 기존 메소드의 동작을 수정할 수 있습니다. 이를 통해 Swift 표준 라이브러리나 프레임워크의 기능을 확장할 수 있습니다.
'Closure'는 코드의 블록입니다. 이 블록을 변수나 상수처럼 저장하거나 전달할 수 있습니다. 이렇게 함수의 특징을 가지고 있기 때문에 코드가 단순해지고 쉬워집니다. 'Async/Await' 은 비동기적인 작업 처리를 위한 방식입니다. 비동기란 하나의 작업이 끝나기 전에 다음 작업을 먼저 실행하는 방식입니다. 이러한 처리 덕분에 웹페이지가 로딩될 때 다른 작업을 할 수 있습니다.
Swift에서는 비동기 작업을 더 효율적으로 제어하려고 Async/Await를 도입했습니다. 기존의 방식은 흐름이 복잡하고 어려웠으나 두 키워드를 통해 간단하게 만들었습니다. Async와 Await 키워드로 비동기 작업임을 정의하면 기존에 Closure를 중첩해서 쓰던 코드보다 간단해집니다.
Combine 프레임워크는 시간이 지나면서 값을 처리하기 위한 Swift API 입니다. Apple에서 Reactive 하게 프로그래밍할 수 있도록 만든 자체 내장 프레임워크 입니다. Delegate, Closure 등으로 비동기 작업을 처리하긴 했지만 해당 코드들을 이용했을 때보다 코드가 깔끔해진다는 장점이 있습니다. iOS13부터 지원합니다.
UIKit은 iOS 애플리케이션의 UI를 구현하고 이벤트를 관리하는 프레임워크입니다. 스토어에 배포된 애플리케이션들의 화면을 그리는 건 거의 UIKit의 역할입니다. 현재까지 iOS의 기본 UI 프레임워크였고, 시작적인 툴로 StoryBoard를 지원합니다.
UIKit은 사용자 터치 같은 이벤트가 발생하면 뷰를 그리도록 합니다. 뷰에 여러 기능들이 담기면서 레거시 코드가 늘어난다는 단점이 있었습니다.
SwiftUI는 Apple에서 UIKit의 문제점을 보완하고 더 편리하게 UI를 구성하고자 개발한 프레임워크입니다. 코드 기반으로 화면을 그릴 수 있고, 데이터의 상태에 따라 UI가 변경된다는 특징을 가집니다.

좋은 소프트웨어 = 강한 응집력 + 약한 결합력
강한 응집력 -> 클래스에 하나의 문제 해결을 위한 데이터와 메서드를 모아놓는 방식
약한 결합력 -> 각 클래스는 독립적이 되도록 디자인
자료 추상화, 상속, 다형성, 동적 바인딩
스몰토킹, Objective-C, C++, C#, Java, 파이썬, 루비, Swift
클래스란?
같은 종류(혹은 문제 해결을 위한)의 집단에 속하는 속성과 행위를 정의한 것.
기본 사용자 정의 데이터 타입
다른 클래스 또는 외부 요소와 독립적으로 디자인
객체란?
클래스의 인스턴스(실제로 메모리에 할당되어 동작하는 모양을 갖춘 것)
자신 고유의 속성이 있으며 클래스에서 정의한 행위 동작 가능
스위프트에서는 '객체'라는 용어보다 '클래스의 인스턴스'라는 표현 사용
메서드 또는 메시지란?
객체가 클래스에 정의된 행위를 실질적으로 하는 함수
메서드(메시지)를 통해 객체에 명령 전달 가능
클래스는 객체가 만들어지기 위한 청사진
실제 메모리에 객체를 할당해 인스턴스를 만들기 위한 일종의 설계코드
클래스에 정의된 모양대로 객체가 생성되고, 객체간의 메시지를 통해 프로그램의 각 명령이 실행된다.
굉장히 쉬운 대규모 병렬처리
프로그램이 상태 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 패러다임
함수 자체의 응용을 중요하게 여김.
객체지향이나 명령형은 프로그램에서 값이나 상태의 변화를 중요시 함
그래서 함수 실행 시 함수가 전달받은 전달인자 외에도 포인터, 레퍼런스 값 등 객체의
상태 값 또는 메모리 참조 값 등이 변경될 수 있으며 함수 내부의 처리에도 영향을미침
함수에 전달된 인자 값만 결과에 영향을 주므로 상태 값을 갖지 않고 순수하게 함수만으로 동작
어떤 상황에서 프로그램을 싱행하더라도 일정하게 같은 결과 도출 가능
프로세스 혹은 스레드별로 특정 값을 참조하기 위해 락을 걸거나 대기할 필요 없음.
모나드, 함수객체, 필터, 맵, 플랫맵, 리듀스 기능 사용 가능
함수를 일급 객체로 다룸
일급 객체 조건
- 전달인자로 전달 가능
- 동적 프로퍼티 할당 가능
- 변수나 데이터 구조 안에 담을 수 있다
- 변환 값으로 사용 가능
- 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별 가능
기존의 스칼라 타입인 정수, 실수 등은 거의 모든 언어에서 일급 객체 조건을 갖추지만, 대부분의 함수는 그렇지 않다.
- 스위프트의 함수는 일급 객체 조건을 모두 충족하기에, 함수를 일급 객체로 취급 함수가 일급 객체가 된다는 의미는 다양한 종류의 함수를 호출하고, 전달하고, 반환하는 등의 동작만으로도 프로그램 구현이 가능하다는 뜻이다.
순수하게 함수형 프로그래밍 패러다임으로 프로그램을 작성했을 때 장점
- 여러 가지 연산 처리 작업이 동시에 일어나는 프로그램 쉽게 작성 가능
- 멀티 코어 혹은 여러 개 연산 프로세서를 사용하는 시스템에서 효율적인 프로그램 만들기 쉬움
- 상태변화에 따른 부작용에서 자유로워지므로 순수하게 기능 구현에 초점을 맞추어 설계 가능
- 객체지향 기반에 함수형 프로그래밍이 가능하도록 업데이트 된 언어: Java 8, C# 3.0
2.0 버전이 발표되면서 프로토콜 익스텐션이 추가되었고, 비로소 스위프트가 강력한 프로토콜 지향 언어로 변모했습니다.