개요
- 스위프트는 안전을 우선으로 하는 프로그래밍 패턴을 지향하며, 옵셔널, 제네릭, 프로토콜, 튜플, 익스텐션 등 새로운 기능을 많이 도입함.
- 현재 애플은 스위프트를 오픈소스로 공유하였음.
- ARC(Automatic Reference Counting, 자동 참조 횟수 계산)를 지원하므로 쉽게 메모리를 관리할 수 있음.
- Objective-C의 동적 객체 모델과 매개변수 형식을 스위프트에 도입하였음.
스위프트의 역사
- 스위프트는 2010년 개발을 시작. Objective-C, 루비, 파이썬, C#, 러스트, 하스켈, CLU등 많은 프로그래밍 언어 컨셉 참고
- 2014년 9월 정식 발표
스위프트의 언어적 특성
오픈소스로 전환되면서 Safe, Fast, Expressive로 특징을 변경
[안정성 Safe]
- 스위프트는 안전한 프로그래밍을 지향한다.
- 프로그래밍 중에 프로그래머가 저지를 수 있는 실수를 엄격한 문법을 적용해 미연에 방지하고자 노력.
- 옵셔널이라는 기능을 비롯하여, guard 그문, 오류처리, 강력한 타입 통제 등을 통해 스위프트는 안전한 프로그래밍을 구현하고자 함.
[신속성 Fast]
- 스위프트는 C 언어를 기반으로 한 C, C++, Objective-C와 같은 프로그래밍 언어를 대체하려는 목적으로 만들어졌음.
- 아직은 미흡하지만 스위프트는 C 언어 수준과 동등한 성능을 일정한 수준으로 유지하는 데 초점을 맞춰 개발되었음.
- 실행 속도의 최적화뿐만 아니라 컴파일러를 지속적으로 개량해 더 빠른 컴파일 성능을 구현해 나가고 있음.
[더 나은 표현성 Expressive]
-
현대적이고 세련된 문법을 구사하고자 계속해서 노력하고 있음.
-
스위프트는 여러 가지 프로그래밍 패러다임을 차용한 다중 패러다임 프로그래밍 언어이다.
-
크게 보면 명령형 프로그래밍 패러다임, 객체지향 프로그래밍 패러다임, 함수형 프로그래밍 패러다임, 프로토콜 지향 프로그래밍 패러다임을 차용.
-
정확하게는 명령형과 객체지향 프로그래밍 패러다임을 기반으로 한 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍 패러다임을 지향한다.
객체지향
[객체지향 프로그래밍 패러다임]
- 객체지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 기존의 명령형 프로그래밍 패러다임의 시각에서 벗어나 여러 개의 독립된 단위인 객체의 모임으로 파악하고자 하는 시각이다. 각각의 객체는 서로 메세지를 주고 받고 데이터를 처리할 수 있다.
- 소프트웨어 공학의 관점에서 소프트웨어의 질을 향상하려면 강한 응집력(Strong Cohesion)과 약한 결합력(Weak Coupling)을 지향해야 한다. 객체지향 프로그래밍은 클래스에 하나의 문제 해결을 위한 데이터와 메서드를 모아놓은 방식으로 응집력을 강화한다. 또, 각 클래스는 독립적이 되도록 디자인해 결합력을 약화한다.
- 객체지향 프로그래밍의 주요 특징으로는 자료 추상화, 상속, 다형성, 동적 바인딩 등이 있다.
[클래스와 객체]
- 클래스 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성과 행위를 정의한 것 객체지향 프로그램의 기본 사용자 정의 데이터 타입이라고 할 수 있다. 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인되어야 한다.
- 객체(object) 클래스의 인스턴스(실제로 메모리에 할당되어 동작하는 모양을 갖춘 것, instance)이다. 객체는 자신 고유의 속성이 있으며 클래스에서 정의한 행위를 할 수 있다. 스위프트에서는 '객체'라는 용어보다는 '클래스의 인스턴스'라는 표현을 사용한다. (인스턴스는 열거형, 구조체 인스턴스도 있기 때문에 클래스 인스턴스를 지칭할 땐 반드시 '클래스 인스턴스'라 표현해야 한다. )
- 메서드 또는 메세지 객체가 클래스에 정의된 행위를 실질적으로 하는 함수.
함수형
[함수형 프로그래밍 패러다임]
- 함수형 프로그래밍 패러다임의 가장 큰 장점은 '대규모 병렬처리가 굉장히 쉽다'는 점이다.
- 함수형 프로그래밍 패러다임은 프로그램이 상태의 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 패러다임이다.
- 기존 객체지향 프로그래밍 패러다임이나 명령형 프로그래밍 패러다임에서는 프로그램에서 값이나 상태의 변화를 중요하게 여기지만 함수형 프로그래밍 패러다임은 함수 자체의 응용을 중요하게 여긴다.
- 수학적 함수와 명령형 함수의 차이점은 코드 이해와 실행 결과의 관점에서도 큰 차이를 보인다.
- 명령형 함수를 이용하는 객체지향 프로그래밍은 과거의 유산이라고도 볼 수 있는 절차지향 프로그래밍 패러다임이 포함되어 있다.
- 그래서 함수 실행 시 함수가 전달받은 전달인자 외에도 포인터, 레퍼런스 값 등 객체의 상태 값(프로퍼티 값) 또는 메모리 참조 값 등이 변경될 수 있으며 함수 내부의 처리에도 영향을 미칠 수 있다.
- 하지만 수학적 함수를 이용하는 함수형 프로그래밍은 순수하게 함수에 전달된 인자 값만 결과에 영향을 주므로 상태 값을 갖지 않고 순수하게 함수만으로 동작한다.
- 따라서 어떤 상황에서 프로그램을 실행하더라도 일정하게 같은 결과를 도출할 수 있다.
- 프로그램이 동작하는 흐름에서 상태(값)가 변하지 않으면 함수 호출이 각각 상호 간섭 없이 배타적으로 실행되므로 병렬처리할 때 부작용이 거의 없다.
- 프로세스 혹은 스레드별로 특정 값을 참조하기 위해 락을 걸거나 대기할 필요가 없기 때문이다.
- 또한 필요한 만큼 함수를 나누어 처리할 수 있도록 스케일업할 수 있기 때문에 대규모 병렬처리에 큰 강점이 있다.
- 또 다른 함수형 프로그래밍의 큰 특징은 함수를 일급 객체(First-class Citizen)로 다룬다는 점이다. 다음 조건을 모두 충족해야 일급 객체가 될 수 있다. [1] 전달인자로 전달할 수 있다. [2] 동적 프로퍼티 할당이 가능하다. [3] 변수나 데이터 구조 안에 담을 수 있다. [4] 반환 값으로 사용할 수 있다. [5] 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별할 수 있다. (5) 스위프트의 함수는 위 조건을 모두 충족할 수 있기에 함수를 일급 객체로 취급한다.
함수가 일급 객체가 된다는 의미는 다양한 종류의 함수를 호출하고, 전달하고, 반환하는 등의 동작만으로도 프로그램을 구현할 수 있다는 뜻이다.
Untitled
[스위프트가 함수형 프로그래밍 패러다임을 차용한 의의]
- 순수하게 함수형 프로그래밍 패러다임으로 프로그램을 작성하면 다음 장점이 있음. [1] 여러 가지 연산 처리 작업이 동시에 일어나는 프로그램을 만들기 쉽다. [2] 멀티 코어 혹은 어려 개 연산 프로세서를 사용하는 시스템에서 효율적인 프로그램을 만들기 쉽다. [3] 상태변화에 따른 부작용에서 자유로워지므로 순수하게 기능 구현에 초점을 맞추어 설계할 수 있다.
프로토콜 지향
- 2015년 2.0 버전이 발표되면서 추가된 프로토콜 익스텐션은 스위프트가 강력한 프로토콜 지향언어(Protocol-Oriented Language)로 변모하는 데 큰 공헌을 함.
- 프로토콜 지향 프로그래밍은 참조 타입인 클래스의 인스턴스보다 값 타입을 더 효율적으로 사용하며, 오류를 줄일 방안이라 소개.
- 스위프트에서는 구조체와 열거형에 기존의 클래스에서 구현할 수 있었던 캡슐화, 추상화, 접근 제어 등의 기능을 모두 구현할 수 있음. 프로토콜에 익스텐션을 활용할 수 있기 때문에 프로토콜 지향 프로그래밍이 가능해짐. 이는 참조 타입의 참조 문제에서 조금 더 자유로울 수 있고, 다중 상속이 불가능한 한계를 뛰어넘을 수 있으며, 더 나은 추상화 메커니즘을 구현할 수 있다는 의미임.