Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
iOS Developer/Swift

스위프트와 프로그래밍 패러다임

by Toughie 2023. 4. 8.

Figma로 만들었음 ㅎㅎ

'스위프트의 언어적 특성'

안정성(Safe)

엄격한 문법을 통해 개발자의 실수 미연에 방지

옵셔널, guard, 에러처리, 타입통제 등을 통해 안전한 프로그래밍 가능

 

신속성(Fast)

C언어 기반 프로그래밍 언어를 대체하려는 목적으로 만들어짐

C언어 수준과 성능과 속도가 동등한 수준이 되도록 꾸준히 발전되는 중

컴파일 속도도 빠름! (스위프는 컴파일 언어)

 

표현성(Expressive)

다양한 언어들을 참고해 편하고 읽기 쉬운 문법을 구현할 수 있음.

 

'다중 패러다임 프로그래밍 언어'

 

스위프트는 명령형 프로그래밍과 객체지향 프로그래밍 패러다임을 기반으로 한

함수형 프로그래밍 패러다임 / 프로토콜 지향 프로그래밍 패러다임 지향.

 

 

객체지향 프로그래밍 패러다임

Object-Oriented  Programming, OOP

캡슐화, 추상화, 다형성, 상속, 동적 바인딩 등의 특징

 

컴퓨터의 프로그램을 명령어의 리스트로 보는 명령형 프로그래밍 패러다임에서 벗어나

여러 독립된 단위인 '객체'의 모임으로 파악하고자 하는 패러다임.

객체는 서로 소통 (메세징)을 하며 데이터를 처리함.

 

객체지향 프로그래밍은 변경이 유연하고 유지보수가 간편하며 직관적인 장점이 있음.

'강한 응집력'과 '약한 결합력' 지향.

 

클래스에 하나의 문제해결을 위해 (관련된) 데이터와 메서드를 모아놓아 응집력 강화

클래스끼리는 독립적으로(의존하지 않도록) 디자인해 결합력을 약화

 

클래스와 객체

클래스

커스텀 데이터 타입. 위에서 언급한 강한 응집력과 약한 결합력 지향해서 디자인

클래스는 설계도, 붕어빵 틀, 쿠키 틀로 비유가 많이 됨.

메모리에 객체를 할당해 인스턴스를 만들기 위한 설계도(청사진)

 

객체

클래스의 인스턴스를 지칭

* 객체 != 인스턴스, 객체 == 클래스의 인스턴스

구조체의 인스턴스도 있고 열거형의 인스턴스도 있기에, 클래스의 인스턴스가 객체와 동의어임.

 

실제로 메모리에 할당 된(초기화) 것. 

고유의 프로퍼티, 메서드가 있음.

 

메서드(메시지)

클래스 안에 정의된 함수.

메서드를 통해 객체에 명령 전달.

객체 간 명령 전달 혹은 데이터 전달은 메서드를 통해 이루어 지며

이런 행위를 메서드를 호출한다.(디스패치), 메세지를 전달한다고 표현.

 

함수형 프로그래밍 패러다임

장점

- 대규모 병렬처리가 쉬움.(여러 연산 처리 작업이 동시에 일어나는 프로그램 등_비동기)

- 멀티 코어, 멀티 프로세서 활용 시스템에서 효율적인 프로그래밍 쉬움

- 상태변화에 따른 사이드이펙트가 없어서(적어서) 기능에 초점을 맞춰 설계 가능

 

프로그래임이 상태의 변화 없이(변수, 프로퍼티, 값 등) 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 패러다임

함수 자체의 조합, 응용이 중요함.

 

명령형 함수를 이용하는 객체지향 프로그래밍은 절차지향 프로그래밍이 포함되어 있음(절차 중심, How?)

->함수를 실행하면 파라미터, 포인터, 레퍼런스 값, 상태값(프로퍼티) 등 변경 가능한 요소가 굉장히 많고
함수 내부 처리에도 영향이 있을 수 있음.

 

But 

수학적 함수를 이용하는 함수형 프로그래밍에서는 함수에 전달된 인자 값만 결과에 영향을 줌

어떤 상황에서 프로그램을 실행해도 항상 같은 결과가 나옴.

함수의 호출이 상호 간섭 없이 배타적으로 실행 -> 병렬처리 시 사이드이펙트가 거의 없음.

(프로세스, 스레드별로 특정 값을 참조하기 위해 기다리거나(동기), 락을 걸 필요가 없음.) 

 

⭐️ 함수를 일급 객체로 다룸

아래 조건을 모두 만족해야 일급 객체임.

(전달인자로 전달 되고 반환 값으로 사용 가능 -> 고차함수)

 

- 전달인자(Argument)로 전달 가능

- 동적 프로퍼티 할당 가능(변하는 값)

- 변수/ 데이터 구조에 담을 수 있음

- 반환 값(return)으로 사용 가능

- 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별 가능

 

함수형 프로그래밍 패러다임을 채택하기에

map, filter, reduce, flatmap, forEach 등의 고차함수도 사용 가능.

 

명령형 프로그래밍 vs 함수형 프로그래밍

명령형 프로그래밍에서 중시하는 요소들

- 수행 알고리즘(how?)

- 상태의 변경

- 상태 변경 추적

- 실행의 순서(순차)

- 제어문(반복, 조건) / 메서드 호출

- 클래스/구조체의 인스턴스

 

함수형 프로그래밍에서 중시하는 요소들

- 원하는 정보(what)

- 필요한 변환

- 함수 호출(재귀 함수 호출 등)

- 주로 함수를 통해 조작

 

스위프트는 사실 객체지향과 함수형 프로그래밍 패러다임 모두 차용

애플의 프레임워크는 대부분 객체지향 프로그래밍 패러다임 기반으로 설계된 수많은 클래스로 구성되어 있음.

(스위프트 문법과 관련된 것들은 구조체로도 많이 되어 있음)

 

프로토콜 지향 프로그래밍

프로토콜 익스텐션

- 참조 타입인 클래스의 인스턴스보다 값 타입을 더 효율적으로 사용 가능하며 오류를 줄일 방안

-> 클래스를 상속하면 불필요한 프로퍼티까지 다 상속되는데(참조문제), 프로토콜을 사용하면 이를 방지할 수 있기 때문

(필요한 프로퍼티, 필요한 메서드만 추가 가능)

 

- 또한 스위프트의 클래스는 다중상속이 불가능하기에 이 한계도 넘을 수 있음.

- 더욱 나은 추상화 메커니즘 구현 가능 (프로토콜 채택과 준수를 통해)