Swift 스위프트란?
iOS, macOS, watchOS, tvOS 등 자사의 제품 개발에 활용하고자 만든 새 프로그래밍 언어
간단하게 Swift 언어의 특징을 알아봅시다 🧐
- 안전을 우선으로 하는 프로그래밍 패턴 지향
- 옵셔널, 제네릭, 프로토콜, 튜플, 익스텐션 등 새로운 기능 도입
- 현재 오픈소스로 공유되었으며 애플 플랫폼 외에 다양한 플랫폼에서 사용 가능
- 편리하며 고차원적 언어
- ARC(자동 참조 카운팅, Automatic Reference Counting)을 지원하여 쉽게 메모리 관리
- Objective-C의 동적 객체 모델과 매개변수 형식 도입
- 스크립트 언어처럼 사용할 수 있는 Playground 지원
- 컴파일러 성능은 프로그램 실행 속도 향상 및 빌드 시간 단축에 최적화
- 소괄호 생략 가능
- 세미콜론 생략 가능
- 중괄호 필수
- 자유도가 높아 작성자의 스타일에 따라 다양한 방식으로 코딩 가능.
가독성이 떨어질 수 있으므로 주의 필요
Swift의 언어적 특성
Safe, Fast, Expressive
Safe 안전성
- 안전한 프로그래밍 지향
프로그래밍 도중 개발자가 저지를 수 있는 실수를 엄격한 문법을 적용해 미연에 방지
버그를 수정하거나 실수를 찾아내는 시간 절약 가능
옵셔널, guard 구문, 오류처리, 강력한 타입 통제
Fast 신속성
- C 언어를 기반으로 한 C, C++, Objective-C와 같은 프로그래밍 언어를 대체하기 위해 만들어진 언어
실행 속도 최적화 및 더 빠른 컴파일 성능 구현 중
Expressive 더 나은 표현성
- 수많은 프로그래밍 언어 문법을 참고해 좀 더 사용하기 편하고 보기 좋은 문법 구현
- 현대적이고 세련된 문법 구사 가능
그 외 특징
- 여러 가지 프로그래밍 패러다임을 차용한 다중 패러다임 프로그래밍 언어
- 명령형 프로그래밍 패러다임
- 객체지향 프로그래밍 패러다임
- 함수형 프로그래밍 패러다임
- 프로토콜 지향 프로그래밍 패러다임
" 명령형과 객체지향 프로그래밍 패러다임을 기반으로 한 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍 패러다임을 지향합니다. "
스위프트에서 가장 강조하는 부분은 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍 패러다임
C : 명령형 프로그래밍 패러다임
C++, JAVA : 다중 프로그래밍 패러다임 (명령형 + 객체지향)
Swift : 다중 프로그래밍 패러다임 (명령형 + 객체지향 + 함수형 + 프로토콜 지향)
그럼 여기서 궁금해지는 프로그래밍 패러다임들에 대해 살펴보도록 합시다. 🧐
객체지향
객체지향 프로그래밍 패러다임
- 컴퓨터 프로그래밍 패러다임의 한 종류
- 컴퓨터 프로그램을 명령어의 목록으로 보는 기존의 명령형 프로그래밍 패러다임의 시각에서 벗어남
- 여러 개의 독립된 단위인 객체의 모임으로 바라보는 시각
- 각각의 객체는 서로 메시지를 주고받거나 데이터 처리 가능
- 간편한 소프트웨어 개발 및 유지보수
- 직관적으로 코드 분석 가능
- 좋은 소프트웨어 = 강한 응집력 + 약한 결합력
- 강한 응집력 => 클래스에 하나의 문제 해결을 위한 데이터와 메서드를 모아놓는 방식
- 약한 결합력 => 각 클랙스는 독립적이 되도록 디자인
- 자료 추상화, 상속, 다형성, 동적 바인딩
- 스몰토크, Objective-C, C++, C#, 자바, 파이썬, 루비, Swift
클랙스와 객체
- 클래스란?
같은 종류(혹은 문제 해결을 위한)의 집단에 속하는 속성과 행위를 정의한 것.
기본 사용자 정의 데이터 타입
다른 클래스 또는 외부 요소와 독립적으로 디자인
- 객체란?
클래스의 인스턴스(실제로 메모리에 할당되어 동작하는 모양을 갖춘 것)
자신 고유의 속성이 있으며 클래스에서 정의한 행위 동작 가능
스위프트에서는 '객체'라는 용어보다 '클래스의 인스턴스'라는 표현 사용
- 메서드 또는 메시지란?
객체가 클래스에 정의된 행위를 실질적으로 하는 함수
메서드(메시지)를 통해 객체에 명령 전달 가능
클래스는 객체가 만들어지기 위한 청사진
실제 메모리에 객체를 할당해 인스턴스를 만들기 위한 일종의 설계코드
클래스에 정의된 모양대로 객체가 생성되고 객체간의 메시지를 통해 프로그램의 각 명령이 실행된다.
함수형
함수형 프로그래밍 패러다임
-
굉장히 쉬운 대규모 병렬처리
-
프로그램이 상태 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 패러다임
-
함수 자체의 응용을 중요하게 여김.
객체지향이나 명령형은 프로그램에서 값이나 상태의 변화를 중요시 함
그래서 함수 실행 시 함수가 전달받은 전달인자 외에도 포인터, 레퍼런스 값 등 객체의 상태 값 또는 메모리 참조 값 등이 변경될 수 있으며 함수 내부의 처리에도 영향을 미침
-
함수에 전달된 인자 값만 결과에 영향을 주므로 상태 값을 갖지 않고 순수하게 함수만으로 동작
어떤 상황에서 프로그램을 실행하더라도 일정하게 같은 결과 도출 가능
-
프로세스 혹은 스레드별로 특정 값을 참조하기 위해 락을 걸거나 대기할 필요 없음
-
모나드, 함수객체, 필터, 맵, 플랫맵, 리듀스 기능 사용 가능
-
함수를 일급 객체로 다룸
일급 객체 조건
- 전달인자로 전달 가능
- 동적 프로퍼티 할당 가능
- 변수나 데이터 구조 안에 담을 수 있다
- 반환 값으로 사용 가능
- 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별 가능
기존의 스칼라 타입인 정수, 실수 등은 거의 모든 언어에서 일급 객체 조건을 갖추지만, 대부분의 함수는 그렇지 않다.
- 스위프트의 함수는 일급 객체 조건을 모두 충족하기에, 함수를 일급 객체로 취급
함수가 일급 객체가 된다는 의미는 다양한 종류의 함수를 호출하고, 전달하고, 반환하는 등의 동작만으로도 프로그램 구현이 가능하다는 뜻이다.
순수하게 함수형 프로그래밍 패러다임으로 프로그램을 작성했을 때 장점
- 여러 가지 연산 처리 작업이 동시에 일어나는 프로그램 쉽게 작성 가능
- 멀티 코어 혹은 여러 개 연산 프로세서를 사용하는 시스템에서 효율적인 프로그램 만들기 쉬움
- 상태변화에 따른 부작용에서 자유로워지므로 순수하게 기능 구현에 초점을 맞추어 설계 가능
- 객체지향 기반에 함수형 프로그래밍이 가능하도록 업데이트된 언어 : 자바 8, C# 3.0
프로토콜 지향
2.0 버전이 발표되면서 프로토콜 익스텐션이 추가되었고 비로소 스위프트가 강력한 프로토콜 지향 언어로 변모했습니다.
- 구조체와 열거형에도 클래스에서 구현할 수 있는 캡슐화, 추상화, 접근 제어 기능 모두 구현 가능
- 프로토콜에 익스텐션을 활용할 수 있기에 프로토콜 지향 프로그래밍 가능
- 참조 타입의 참조 문제에서 자유로워짐
- 더 나은 추상화 메커니즘 구현 가능
- 다중상속 가능