[머릿말]
SwiftUI를 공부하려 보면 선언형 프로그래밍과 명령형 프로그래밍이라는 말을 접하게 된다. SwiftUI는 선언형 프로그래밍이라고 하고, UIKit은 명령형 프로그래밍이라고 하는데 이것들이 무엇이고 차이점은 무엇인지 궁금하여 찾아보게 되었다.
1. 프로그래밍 패러다임
명령형 프로그래밍과 선언형 프로그래밍은 프로그래밍 패러다임의 일종이다. 그렇다면 프로그래밍 패러다임이란 무엇일까?
프로그래밍이나 소프트웨어 개발에 접근하는 특정한 방식.
특정 관점과 접근 방식에 따른 코딩 방식.
간단하게 말해 프로그래밍 패러다임은 '프로그래밍을 하는 방식' 정도로 이해할 수 있다. 그럼 이제 명령형 프로그래밍과 선언형 프로그래밍의 차이점에 대해 알아보자.
2. 명령형 프로그래밍(Imperative) vs 선언형 프로그래밍(Declarative)
명령형 프로그래밍이란 '어떻게?'를 뜻하고 선언형 프로그래밍이란 '무엇을?'을 뜻한다. 잘 이해가 되지 않을 수 있지만 몇가지 예를 보면 쉽게 이해할 수 있다.
case 1) 라면 끓이기
- 명령형 프로그래밍 : "냄비에 물을 받아서 끓이고 물이 끓는다면 스프와 면을 넣고 면이 익을 때까지 끓인다"
- 선언형 프로그래밍 : "라면을 끓인다"
Case 2) 샤워하기
- 명령형 프로그래밍 : "물의 온도를 적절하게 설정하고 샴푸, 바디워시 등을 사용하여 몸을 씻고 물로 헹궈낸다"
- 선언형 프로그래밍 : "샤워를 한다"
이처럼 명령형 프로그래밍은 어떤 행위에 대한 A-Z를 나타내는 반면 선언형 프로그래밍은 단순 어떤 행위를 지칭하기만 하는 형태임을 알 수 있다. 그렇다면 선언형 프로그래밍처럼 단순 "라면을 끓인다", "샤워를 한다" 등과 같은 명령을 컴퓨터가 어떻게 처리할 수 있을까? 이는 원하는 행위에 대한 방법, 즉 명령형 프로그래밍이 기본적으로 되어 있기 때문이다. 라면 끓이기, 샤워하기 등에 대한 방법이 이미 정의되어 있기 때문에 사용자는 그저 정의된 방법을 가져다 사용하기만 하면 되는 것이다. 바로 이 정의된 방법이 함수(Function)인 것이다. 그렇기 때문에 위 프로그래밍 패러다임에서 선언형 프로그래밍에 함수형 프로그래밍이 속하는 것이다.
2-1. 재사용성의 차이
선언형 프로그래밍은 잘 짜여진 명령형 프로그래밍을 기반으로 한다.
"샤워하기"라는 행위에 대한 예제를 다시 사용해보겠다.
명령형 프로그래밍에서 특정 대상에 대한 "샤워하기" 명령을 정의했다고 하자. 만약 샤워를 하는 대상이 '아기', '노인', '반려동물' 등으로 다르다고 하면 각각에 대한 정의를 해야 한다.
그러나 선언형 프로그래밍은 "누구(Who)"에 대한 "샤워하기" 명령인지만 전달해주면 알아서 처리를 해준다. 이것이 가능한 이유는 선언형 프로그래밍은 잘 짜여진 명령형 프로그래밍이라고 할 수 있기 때문이다.
같은 명령에 대해 대상만 바꿔주면 되므로 재사용성은 선언형 프로그래밍이 명령형 프로그래밍보다 좋다.
2-2. 코드에서의 차이
간단한 예제로 '오름차순 정렬 알고리즘'을 살펴보도록 하자.
명령형 프로그래밍
var myArr = [2, 5, 3, 1, 4]
// 명령형 프로그래밍
for i in 0..<myArr.count-1 {
for j in i..<myArr.count {
if myArr[i] > myArr[j] {
(myArr[i], myArr[j]) = (myArr[j], myArr[i])
}
}
}
선언형 프로그래밍
var myArr = [2, 5, 3, 1, 4]
myArr.sort()
간단하게 명령형 프로그래밍과 선언형 프로그래밍에서의 오름차순 정렬 코드를 작성해보았다. 간단한 예제임에도 불구하고 선언형 프로그래밍의 코드가 명령형 프로그래밍의 코드보다 훨씬 더 간결한 것을 확인할 수 있다.
선언형 프로그래밍의 코드가 더 간결할 수 있는 이유는 선언형 프로그래밍에서 사용한 'sort( )' 함수가 잘 짜여진 명령형 프로그래밍이기 때문이다. 그러므로 사용자는 그저 잘 정의된 'sort( )' 함수를 가져다 사용하기만 하면 된다.
이처럼 사용이 훨씬 간결하고 공부하기도 쉬운 선언형 프로그래밍 방식인 SwiftUI를 많이 사용하는 추세라고 한다.
그러나 개발이 오래된 앱이라든지, 기타 특정 부분에 대해서는 아직도 명령형 프로그래밍 방식인 UIKit이 사용되는 부분도 있다고 하니 기본적으로 공부는 SwiftUI를 기반으로 하되, UIKit을 사용해야 하는 부분에 대한 학습도 별도로 필요한 것 같다.
끝!
'[Programming Language] > [Swift]' 카테고리의 다른 글
[Swift] ASCII Code 변환 방법(숫자 <-> 문자 변환 방법) (0) | 2024.08.22 |
---|---|
[Swift] @discardableResult - 반환값 무시 (0) | 2024.08.21 |
[Swift] 열거형(enum: Enumerations) 총 정리 (3) | 2024.07.22 |
[Swift] 함수(Functions) 총 정리 (1) | 2024.07.14 |
[Swift] 코딩 테스트에서 자주 쓰이는 max, min, zip, filter, reduce (1) | 2024.07.13 |