
유행, 트렌드, 패러다임.
당신은 이 단어들의 차이를 아는가?
물론 사람마다 정의가 다를 수 있지만 내가 생각하는 의미는 다음과 같다.

유행은 일시적인 현상으로 짧은 시간 동안 폭발적으로 성장했다가 사그라드는 것이다.

트렌드는 유행보다 비교적 긴 시간동안, 즉 최소 수년이상 지속되는 현상이다.

패러다임은 한 시대를 풍미하는 사람들의 관점이나 인식 등이다.
가령 2017년에 농심은 '끓여 먹는 컵라면의 출시로 컵라면의 패러다임을 바꾼다.'고 했었다.
사람들의 인식에서 봉지라면은 끓여 먹는 것이고 컵라면은 그렇지 않았으니까.
프로그래밍의 관점을 어떻게 가져갈 것인지에 대한 패러다임이다.
그렇다보니 프로그래밍 언어는 저마다 지원하는 프로그래밍 패러다임이 다르다.

탕수육에 소스는 부어 먹는 것인가 찍어먹는 것인가?
어떤 사람들은 당연히 부어 먹는 것이라고 생각할테고, 어떤 사람들은 당연히 찍어 먹는 것이라고 생각할 것이다.
물론 그 밖에도 볶아 먹는 것이라는 사람도 있을 것인데, 서로 패러다임이 다를 뿐이지 패러다임이 아닌 게 아니다.
프로그래밍 언어는 결국 프로그래밍을 하기 위해 생긴 것이므로 프로그래밍 패러다임을 지원한다.
그런데 꼭 하나의 언어가 하나의 패러다임을 지원하지는 않는다.
대표적으로 Swift가 여러 가지 프로그래밍 패러다임을 차용한 다중 패러다임 프로그래밍 언어이다.

정확하게는 명령형과 객체지향 프로그래밍 패러다임을 기반으로 한 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍 패러다임을 지향합니다.
-야곰, 스위프트 프로그래밍 3판
이처럼 프로그래밍 패러다임과 프로그래밍 언어와의 관계는 프로그래밍 언어가 여러 프로그래밍 패러다임을 지원하기도 하기 때문에 복잡할 수도 있다.
이제 위에서 소개된 Swift의 프로그래밍 패러다임들을 알아보자.
컴퓨터 과학에서 명령형 프로그래밍(命令型 프로그래밍, 영어: imperative programming)은 선언형 프로그래밍과 반대되는 개념으로...
-위키백과
우선 선언형 프로그래밍과 반대의 개념이라고 하는데 그렇다면 선언형의 설명은?
"선언형 언어"라는 것은 명령형 언어와 대비되는 이런 프로그래밍 언어들을 통칭하는 것이다.
-위키백과

얘네 또 순환참조하네
아무튼 더 자세하게 설명을 살펴보자.
프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다. 명령형 프로그램은 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것이다.
WWDC19의 SwiftUI Essentials에서 나온 명령형에 대한 표현이 있다.
명령형 코드에는 명시적 명령을 전송하여 결과를 작성하는 작업이 포함된다.
친구가 빵을 굽는 것을 잊어버리는 등 작은 단계라도 실수하면 최종 결과는 망가진다.
이처럼 명시적 명령을 통해서 프로그래밍을 하는 것이 명령형 프로그래밍이다.
이 명령형 프로그래밍 패러다임에 속하는 유명한 패러다임이 있는데 그것이 바로 객체 지향이다.
객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
-위키백과
명령형 프로그래밍에서 진보해 단순히 명령어의 목록으로 보는 것이 아니라, 상호작용하는 객체들의 모임으로 프로그래밍을 바라보겠다는 것이다.
Swift에서 속성은 프로퍼티를 의미하고, 행위는 메서드를 의미한다.
WWDC15의 Protocol-Oriented Programming in Swift 세션에서는 객체 지향 프로그래밍 패러다임을 언급하면서 다음과 같은 장점들을 나열했다.

나아가 이러한 것들을 함께 사용하면 복잡성을 관리할 수 있다.
그렇기 때문에 객체 지향 프로그래밍은 분명 놀랍다.

마찬가지로 WWDC15의 Protocol-Oriented Programming in Swift 세션에서는 앞선 클래스의 장점이 비단 클래스 뿐만 아니라 다른 타입도 가진 장점이라고 언급한다.
왜 세션 이름이 Object Oriented Programming이 아닌지 생각해보자. 깔려고 그런 것이다.
클래스는 상속이라는 시스템과 참조라는 시스템을 사용하기 때문에 성능이 값타입에 비해 무척 떨어지게 된다.
왜 그런지 궁금하다면 WWDC의 Protocol-Oriented Programming in Swift 세션 및 Understanding Swift Performance 세션을 살펴보면 좋을 것 같다. (물론 그 밖에도 이유를 엿볼 수 있는 여러 좋은 세션이 있다.)
Swift는 개발 단계에서부터 이 프로토콜 지향 프로그래밍 패러다임을 생각하고 만들었다고 한다. 그리고 최초의 프로토콜 지향 프로그래밍 언어라고 한다.
객체 지향 프로그래밍은 결국 클래스를 사용하기 때문에 하나의 슈퍼클래스만을 가질 수 있다. 즉 상속체계는 모놀리식이므로 단일 추상화만을 얻게 된다. 여러 추상화를 모델링해야 하는 경우 적합하지 않다.
또한 상속 때문에 필요 이상으로 타입이 무거워지게 된다.
그 밖에도 상속 체계로 인한 단점이 더 있는데, 프로토콜을 사용하면 이러한 문제점 없이도 추상화를 손쉽게 얻을 수 있다. 물론 다중 추상화도 가능하다.
게다가 extension을 통해 여러 놀라운 일들을 수행할 수 있으므로 꼭 필요한 경우가 아니라면 프로토콜과 값 타입을 사용하는 것이 성능적으로나 추상화의 측면에서나 좋다.
또한 프로토콜 지향적으로 개발했을 때 코드를 테스트하기 쉽다는 이점도 있다.

그렇지만 저 POP 세션이 있던 2015년도에는 아직 클래스를 완전히 배제하고 프로그래밍을 할 수는 없었다고 생각한다.
왜냐하면 UI를 그리는 체계는 모두 클래스 기반이었기 때문이다.

2019년 SwiftUI가 세상에 그 모습을 드러냈다.
요즘 SwiftUI 관련 WWDC를 정주행중인 필자는 앱을 만들면서 class 키워드를 한 번도 사용하지 않고도 앱을 만들 수 있으리란 기대를 갖고 있다.
프로그램이 어떤 방법으로 해야 하는지를 나타내기보다 무엇과 같은지를 설명하는 경우에 "선언형"이라고 한다. 이것은 전통적인 포트란과 C, 자바와 같은 명령형 프로그래밍 언어와는 다른 접근방식인데, 명령형 프로그래밍 언어는 프로그래머가 실행될 알고리즘을 명시해주어야 하는 것이다. 간단히 말하여, 명령형 프로그램은 알고리즘을 명시하고 목표는 명시하지 않는 데 반해 선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것이다.
-위키백과
이번엔 WWDC19의 SwiftUI Essentials에서 나온 선언형에 대한 표현이 있다.
선언적 코드에는 원하는 것을 설명하고 다른 사람이 이를 만드는 방법을 알아내도록 하여 결과를 구축하는 작업이 포함된다.
해야할 일은 원하는 것을 정확히 말하는 것 뿐이다. 커스텀 명령을 입력할 수도 있다.
전문가가 우리를 위해 만들고 있기 때문에 우리는 고품질의 결과를 얻을 것을 보장한다.
선언의 구성으로 프로그래밍을 바라보는 것이 선언형 프로그래밍이다.
눈치 빠른 사람이라면 이미 알아챘을 것이다.
SwiftUI는 바로 선언형 UI라는 것을!
코드에서 해당 관계를 인코딩하는 구조체를 초기화하여 뷰 간의 계층적 관계를 선언한다.
그리고 SwiftUI는 뷰를 화면에 렌더링된 결과로 변환하는 힘든 작업을 수행한다.
이 SwiftUI는 성능적으로 매우 우수하고 가볍기 때문에 성능을 위해 좋은 아키텍처를 포기하지 않아도 괜찮다고 한다.
또한 이 SwiftUI의 뷰는 View라는 프로토콜을 채택한 구조체라는 것을 생각해보면 POP with ValueType의 한 예시가 아닐까싶기도 하다.
아무튼 선언형 프로그래밍 패러다임에 속하는 유명한 패러다임이 또 있다.
함수형 프로그래밍(函數型 프로그래밍, 영어: functional programming)은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 명령형 프로그래밍에서는 상태를 바꾸는 것을 강조하는 것과는 달리, 함수형 프로그래밍은 함수의 응용을 강조한다. 프로그래밍이 구문이 아닌 식이나 선언으로 수행되는 선언형 프로그래밍 패러다임을 따르고 있다.
수학적 함수와 명령형 프로그래밍에서 사용되는 함수는 차이가 있는데, 명령형의 함수는 프로그램의 상태의 값을 바꿀 수 있는 부작용이 생길 수 있다. 이 때문에 명령형 함수는 참조 투명성이 없고, 같은 코드라도 실행되는 프로그램의 상태에 따라 다른 결과값을 낼 수 있다. 반대로 함수형 코드에서는 함수의 출력값은 그 함수에 입력된 인수에만 의존하므로 인수 x에 같은 값을 넣고 함수 f를 호출하면 항상 f(x)라는 결과가 나온다. 부작용을 제거하면 프로그램의 동작을 이해하고 예측하기가 훨씬 쉽게 된다. 이것이 함수형 프로그래밍으로 개발하려는 핵심 동기중 하나이다.
-위키백과
함수의 응용을 강조하는 프로그래밍 패러다임인데, 함수 외부의 상태를 변화시키지 않는다는 점에서 객체간의 상호작용으로 인해 상태가 필연적으로 변화하는 객체 지향과는 큰 차이를 보인다.
그럼에도 객체 지향과 함수형을 모두 지원하는 Swift ㄷㄷ
앞서 명령형이나 객체 지향을 기반으로한 함수형 프로그래밍 패러다임을 지향한다고 했지만 아직 나는 그러한 코드를 본 기억이 없어 명확하게 어떤 느낌의 패러다임인지 설명하지 못해 유감이다.
이렇듯 여러 패러다임이 있고, 이 밖에도 다양한 패러다임들이 있지만 트렌드는 시기별로 조금씩 다른 것 같다.
또 아키텍처 패턴의 트렌드도 패러다임의 트렌드에 영향을 미치기도 하는 것 같다.
만약 내가 사용하는 프로그래밍 언어가 한 패러다임만 지원한다면 트렌드에 따라 휘청거리기도 할 것 같다.
그럼에도 트렌드에 밀려 사장되지 않는 여러 큰 패러다임들을 차용한 다중 패러다임의 Swift와 함께라면 앞으로도 거뜬하지 않을까 싶다!
응~ 객체 지향이 잘 안 되면 함수형으로 바꾸면 그만이야~
사실 패러다임을 갈아타긴 쉽지 않지만 언어를 새로 배우는 것보다 어려울까!
