아요 개발 일기

[iOS] 선언형, 명령형 프로그래밍 본문

iOS

[iOS] 선언형, 명령형 프로그래밍

소진이 2023. 1. 3. 15:32

안녕하세요 :D
오늘은!!! 프로그래밍 종류에 대해 알아보도록 하겠습니다!!
함수형 프로그래밍 공부를 하려고 했는데 그 전에 기초가 되는 부분인 선언형, 명령형, 절차적(절차지향) 프로그래밍을 정리하고 시작해보려구 데리고 왔어용!!
이것은 다.. Rxswift를 공부하기위한 빌드업..,,
학부생 일학년때나 코딩을 처음 시작하게되면 제일 먼저? 기본으로 배우게되는 부분인데,,, 제가 개념을 정확하게 알고있나? 싶기도 하고!
원래 기초일수록 더 탄탄하게 다져야하기때문에!!!! 오늘두 같이 가봅시다!

 


선언형 프로그래밍(Declarative programming)

선언형 프로그래밍은 정의가 두가지로 나뉜다고해요!

 

첫번째

프로그램이 어떤 방법(How)으로 해야하는지를 나타내기 보다는 무엇(What)과 같은지를 설명하는 경우

저는 이 부분을 읽자마자 HTML이 생각났어요!!
맞나? 싶어 더 읽어봤더니 예시로 웹 페이지가 나오더라구요ㅋㅋㅋ

HTML 언어를 혹시! 모르는 분이 있을 수 있으니,
간단한 코드를 데리고 왔습니다!
 

<!doctype html>
<html> 
    <head>
        <title>Example: 3-2</title> 
    </head>
    <body>
        <img src="img/sample.png">
    </body>
</html>


위의 코드 처럼 HTML(HyperText Markup Language)은 제목, 글꼴, 본문, 그림과 같이 "무엇"이 나타나야하는지 묘사하는 것이지, "어떤 방법"으로 컴퓨터 화면에 페이지를 나타내는지를 묘사하지는 않아요!

 


두번째

프로그램이 함수형 프로그래밍 언어, 논리형 프로그래밍 언어, 혹은 제한형 프로그래밍 언어로 쓰인 경우
즉, 여기서 "선언형 언어"라는 것은 명령어 언어와 대비되는 프로그래밍 언어를 통칭한다고 해요!

종종 첫번째 정의에 해당되지 않는데 선언형 언어라고 표기해 놓은 곳들이 있는데, 이 정의에 해당되는 거였나봐요! :O

 


 

선언형 프로그래밍에는 어떤게 있을까??

함수형 프로그래밍

순수 함수를 조합하고 소프트웨어를 만드는 방식

 

제가 이 함수형 프로그래밍을 공부하려고 이 포스팅을 하게된거였죠?!

함수형 프로그래밍은 선언형 프로그래밍 방식을 사용하는 군요 🤔

 

논리형 프로그래밍

논리 문장을 이용하여 프로그램을 표현하고 계산을 수행하는 개념을 기반으로 두는 방식

 


 

선언형 프로그래밍 언어에는 어떤게 있을까?

선언형 프로그래밍 언어는 선언형 프로그래밍을 사용하여 해법을 정의하기보다는 문제를 설명하는 고급언어라고 합니다!

 

함수형 프로그래밍 언어

어떤 연산도 정해진 순서로 계산되어야 한다는 것이 정의되지 않고 함수들의 입력과 출력이 서로 연결되어있기때문에

 

자료지향 프로그래밍 언어와 질의 언어

질의문들이 어떤 방법으로 자료를 찾아야 하는지가 주어지지 않고 대신에 원하는 자료의 기준만 주어지기 때문에

 

선언형 프로그래밍 언어 예시

: HTML, Lisp, Hakell, Prolog, SQL, XML 

 


명령형 프로그래밍(Imperative programming)

명령형 프로그래밍은 선언형 프로그래밍과 반대되는 개념으로, 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종입니다. 컴퓨터가 수행할 명령들을 순서대로 써놓은 것을 말합니다!

명령형 프로그래밍은 프로그래머가 실행될 알고리즘을 명시해주어야 합니다.

간단히 말하여, 명령형 프로그램은 알고리즘을 명시하고 목표는 명시하지 않는 데 반해 선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것입니다.

아래에서 선언형과 명령형 방식을 비교하면서 자세히 설명하겠지만, 간단히 라면 제조법으로 명령형 프로그램을 설명하겠습니다!! 

 

라면 제조법

- 물 550ml를 넣고 끓입니다.

- 분말스프와 후레이크를 넣습니다.

- 면을 넣습니다.

- 4분 30초간 끓입니다.

 

저는 라면 먹을때 스프 먼저 넣어요ㅎㅎㅎ

 

이렇게 단계적으로 진행됩니다!!

이런 요리법이나 공정 점검표같은 것들은 컴퓨터 프로그램은 아니지만, 명령어 프로그래밍과 비슷한 형태의 이해하기 쉬운 개념이라고 합니다. 각각의 단계에 지시 사항들이 있고, 상태라는 것은 현실 세계에 반영되기때문이라고 하내요!!

 


 

명령어 프로그래밍에는 어떤게 있을까??

아래 프로그래밍들은 명령어 프로그래밍과 유사한 프로그래밍들이라고 해요!!

절차지향 프로그래밍은 간혹 명령어 프로그래밍과 동의어로도 사용될때도 있다고도합니다!!

 

절차지향 프로그래밍

수행되어야할 연속적인 계산 과정을 포함하는 방식

 

객체지향 프로그래밍 

객체들의 집합으로 프로그램의 상호작용을 표현

 


 

명령형 프로그래밍 언어에는 어떤게 있을까?

 프로그래밍 언어 예시

: C 언어, 자바, 알골, 파스칼, 에이다 등등

 

프로그래밍을 해본 사람이면 기본적으로 공부한다는 C언어와 자바도 명령형 언어에 속하네요?!!

 

 


 

선언형과 명령형 프로그래밍을 비교해보자!

명령형 프로그래밍에 대해서 설명할때 선언형과 반대되는 개념이라고 했죠?

그러면 비교하기도 더 쉽겠네요!!!! 먼저 이해하기 쉽게 예시를 가져와봤습니다ㅎㅎ

쉬운 예시로, " 여긴 XX인데, OO까지 어떻게 가야할까요?"를 프로그래밍 언어로 옮기는 경우를 살펴봅시다!

 

명령어 방식(How)

- 500m 직진하세요.

- 소진슈퍼를 끼고 우회전 하세요.

- 첫번째 신호등을 직진하여 건너세요. 

 

선언형 방식(What)

- 주소는 수원시 멋있구 이쁘동 12번지입니다.

 

이제 글로써는 어떤 점이 다른지 확 이해 가셨죠?!!

저는 뭐든 글로는 이해가 잘 가도 직접 구현해보는거랑은 천지차이 인 것 같아요!

그런의미로 코드도 같이 살펴 봅시다!! 저는 swift를 공부하고 있기때문에 swift 언어를 사용하겠습니당 :D

 

let arr = [1,3,4,5,6]
var imperative = [Int]()

// 명령형 (How)
for num in arr {
    imperative.append(num * 2)
}

// 선언형 (What)
let declarative = arr.map {$0 * 2}

---------------------------------------------------
결과 화면
[2, 6, 8, 10, 12]

 

 

선언형 방식에서 map을 사용했죠? map도 결국에는 How 방식으로 구현되어있는거 아닌가 싶는데!

제가 참고했던 블로그에서도 똑같은 부분에 의문을 품고 설명해주셨어요!!!

 

위키트리에 보면 아래와 같이 설명이 되어있어요.

명령형 프로그래밍 언어로 선언형으로 프로그램을 작성할 수도 있다. 라이브러리나 프레임워크 내부의 비선언형 부분을 
캡슐화하여 이렇게 할 수 있다.

 

즉, 명령형 방식에서 For문 내부의 변수가 for문 외부로부터 노출되지 않도록 map이란 함수로 캡슐화 시켰기때문에,

선언형이 되었다고 해석이 가능해진다고 합니다!

 

그럼 함수로 쪼개고 쪼개면 그게 선언형 프로그래밍 인가?? 

--> 이걸 기반으로 함수형 프로그래밍이 생긴건가?????

 

위에서 참고한 블로그에서 이렇게 정리해주셨어요!!

각각에 함수를 목적에 맞게 나누고 최소한의 역할만을 수행하도록 구현하여 함수의 조합으로 프로그래밍을 설계하게 되면 각 함수의 유지보수가 쉬워지고 재사용하기 쉬워지는데(map이나 reduce란 함수를 생각해보면) 이것이 선언형 프로그래밍이고 이루고자하는 목적이 아닐까라는 생각이 든다

 

오... 정말 확 이해가 됐어요!!

함수 단위로 나누어서 최소한의 역할과 조합으로 설계하게되면 유지보수와 재사용성이 높아진다!!!!

이게 또 디자인 패턴(MVC, MVVM)이랑도 연관이 되어있는 것 같습니다!!!! 재밌어요!


마치며

선언형과 명령어 프로그래밍을 어느정도 알고 있다고 생각했는데, 아니었어요!!!

오늘 공부한 것을 간단히 정리해보면,

선언형 방식은 명령어 방식을 추상화하여 나타낸 것이고, 함수 단위로 나누어 유지보수와 재사용성을 높인 프로그래밍!

명령형 방식은 알고리즘을 명시해 주어야하며, 컴퓨터가 수행할 명령을 순서대로 적어준 프로그래밍!

함수형 프로그래밍을 공부하기 전에 정리하길 정말 잘했다고 생각하고 있어요!

뭐든 기초가 중요한 것 같습니다!!! 틀린 부분있으면 댓글로 알려주세요! 감사합니다 ㅎㅎ

 


참고 사이트

위키트리

- 선언형 프로그래밍

- 선언형 프로그래밍 언어

- 명령어 프로그래밍

 

블로그

- 선언형 프로그래밍이란 무엇일까? @코드체이서

- 명령형? 선언형? 프로그래밍 방식 @Zereight's Blog