Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ 2주차 생각 과제 ] 명령형 프로그래밍과 선언형 프로그래밍에 대한 나의 생각 💭 #6

Merged
merged 2 commits into from
Nov 13, 2023

Conversation

Arooming
Copy link
Contributor

💎 PR Point

  • md 파일로 작성해서 올려뒀습니다!

🖤 명령형 프로그래밍과 선언형 프로그래밍이란 ?

명령형 프로그래밍은 무엇을 어떻게 할 것인가에 가깝고, 선언형 프로그램은 무엇을 할 것인가에 가깝다. 두 프로그래밍을 이해하기 위해 유명한 예제를 참고해보았습니다.

Red Lobster

나는 회사에서 열심히 일하고 퇴근을 한 뒤 Red Lobster에서 가족과 즐거운 외식을 하기로 결정했습니다. 그리고 Red Lobster에 도착한 뒤 안내 데스크에 다가가서 말합니다.

  • 명령형 (HOW): “12번 테이블 자리가 비어있습니다. 나와 우리 가족은 저 자리로 걸어가 앉을 것입니다.”
  • 선언형 (WHAT): “4명 앉을 자리 부탁해요.”

위의 예시를 보면, 명령형 방식은 실제로 내가 어떻게 자리에 앉을지에 대해 말하고 있다. 따라서 어떻게 자리에 앉을지에 대한 방법을 하나하나 나열한다.

반대로, 선언형 방식은 내가 무엇을 원하는지에 더 집중되어있다. 그렇기 때문에, “그럼 자리에 앉는 방법은 누가 알고있지?”와 같은 질문이 생기곤 한다. 선언형 방식이 제대로 동작하기 위해서는 명령형으로 어떻게가 구현된 것들이 추상화되어 있어야 한다.

  • Red Lobster: 선언형 방식으로 “4명 자리를 부탁해요.” 라고 했지만, 사실 이 문장 속에는 Red Lobster의 직원이 가족을 식탁으로 데려가는 모든 과정을 알고 있다는 가정이 숨어있다.


🖤 각각의 방식은 어떤 상황/ 유형에 적합할까?

// 선언형 프로그래밍
function double (arr) {
  let results = []
  for (let i = 0; i < arr.length; i++){
    results.push(arr[i] * 2)
  }
  return results
}

// 명령형 프로그래밍
function double (arr) {
  return arr.map((item) => item * 2)
}
// 선언형 프로그래밍
function add (arr) {
  let result = 0
  for (let i = 0; i < arr.length; i++){
    result += arr[i]
  }
  return result
}

// 명령형 프로그래밍
function add (arr) {
  return arr.reduce((prev, current) => prev + current, 0)
}

예제를 보면 선언형 프로그래밍으로 구현한 코드는 “어떻게”를 설명하고 있으며, 명시적으로 배열을 반복하거나 원하는 기능을 수행하는 방법에 대해 설명하고 있다.


명령형 프로그래밍으로 구현한 코드는 “무엇”이 일어나는지를 설명하고 있으며, map()과 reduce() 메소드를 활용하여 명령형 방식을 추상화했다. 명령형을 따르는 언어에는 자바, 코틀린, c++ 등이 있다. 명령형 코드는 종종 현재 상태의 컨텍스트에 의존하기 때문에 코드 재사용이 어려운 경우가 많다.

선언형 프로그래밍은 프로그램은 해당 코드가 달성하고자 하는 것에 대해서만 나열하기 때문에, 동일한 코드를 다른 코드에서 재사용하기 쉽다. 선언형 프로그래밍 언어에는 ABSET, Lustre, 프롤로그 등이 있다. SQL 역시 선언형 언어이다.

SELECT *
FROM Users
WHERE country = 'Mexico';

우리가 DB를 어떻게 가져오는지는 관심이 없고, 단순히 무엇을 가져오는지에 대해서만 관심을 두고 있다.

결국 map, reduce 와 같은 기능도 “무엇을”에 초점을 두고 내부 방식은 추상화를 했다고 볼 수 있다.



🖤 JavaScript 에서는 어떤 방식을 선택하는 것이 좋을까?

자바스크립트에서는 배열을 필터링하거나 매핑하는 함수를 사용하는 등 선언형 프로그래밍의 스타일을 갖고 있긴 하다. 하지만 대부분은 변수, 조건문, 반복문, 함수 등을 사용하여 명령형 스타일로 프로그램을 작성할 수 있다. 명령형 프로그래밍은 프로그래밍 언어에서 명령문의 순서로 프로그램의 상태를 변경하는 방식으로 동작한다.

딱 잘라서 자바스크립트는 명령형 프로그래밍 언어이다, 선언형 프로그래밍 언어이다 와 같이 단언할 수는 없다. 명령형 및 선언형 프로그래밍 스타일을 모두 지원하기 때문에, 어떤 방식으로 코드를 작성할 지는 프로그램의 목적과 요구사항에 따라 선택해야 한다.

@Arooming Arooming merged commit 4685572 into main Nov 13, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant