프로그래밍 패러다임(선언형 vs 명령형)

JGwon·2023년 9월 30일
0

프로그래밍

목록 보기
1/4

🤗프로그래밍 패러다임에 대해서

명령형 vs 선언형
평소에 작성하던 코드가 선언형이었다는 것을 패러다임을 공부하면서 알게 됐습니다.
프로그래밍 패러다임이란 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할 지 결정하는 역할을 한다. 새로운 프로그래밍 패러다임을 통해서 이전과는 다른 방식으로 생각해보고, 낯선 코드를 작성할 수 있는 기회가 생겼다는 건 정말 축복이다! (고이는 건 프로그래머에게 죄악이기 때문에?)

최근 프로그래밍 패러다임은 크게 명령형 명령형 프로그래밍, 선언형 프로그래밍으로 구분지을 수 있다.




명령형 프로그래밍

문제를 어떻게(HOW) 해결해야 하는지 컴퓨터에게 명령을 내리는 방법의 프로그래밍이다.

대표적으로 절차적 프로그래밍과 객체지향 프로그래밍이 여기에 속한다.

💡명령형 프로그래밍 예시

"너가 말이야 어?! 성장하는 개발자가 되고 싶으면 어?! 매일 주어진 시간에 최선을 다하고 어!? 휴식때는 온전히 휴식에 집중해야 하고, 어?! 밥도 건강히 먹어야해 ! 어?! 잠도 잘 자야하고! 운동은 필수야! 알겠어?!


절차적(순차적) 프로그래밍

  • 단어 그대로 순차적인 명령을 수행한다. 프로시저 호출의 개념을 바탕으로 하고 있는 패러다임입니다.
  • 프로그램의 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수를 설계(= 데이터 중심)
// 배열에 파라미터로 받고 각 요소들의 값에 2를 곱하는 함수
function imperative(arr){
  let result = [];
  
  for(let i = 0; i < arr.length; i++){
    result.push(arr[i] * 2);
  }
  return result;     
}
// 버튼이 클릭 되었을 때 highlight 클래스를 토글하는 jquery listener
$("#btn").click(function() {
  $(this).toggleClass("highlight")
  $(this).text() === 'Add Highlight'
    ? $(this).text('Remove Highlight')
    : $(this).text('Add Highlight')
})

객체지향 프로그래밍

  • 최소 단위가 객체이며, 객체를 만들고, 이 객체를 사용하여 데이터와 메소드를 묶고 소통하는 프로그래밍 방식이다.
  • 직관적이고 유지보수가 수월하다는 장점이 있습니다.
  • 반대로 자료구조와 함수를 먼저 설계하고 그 후 실행순서와 흐름을 설계
  • 절차적 프로그래밍은 데이터 중심이라면, 객체지향은 객체간의 관계에 초점을 둔다.



선언형 프로그래밍

프로그래밍이 어떤 방법으로 해야 하는지를 나타내기보다 무엇(WHAT)과 같은지를 설명하는 경우선언형이라고 한다.

대표적으로 함수형 프로그래밍이 여기에 속한다.

💡선언형 프로그래밍예시

"성실히 살면 너도 성장형 개발자가 될 수 있어. 야너도"

  • 명령형은 과정을 중요시하고, 선언형은 결과에 집중하는 면이 있다.

방금 전에 봤던 절차적 프로그래밍 js코드를 선언형으로 바꿔보자.

function declarative(arr) {
  return arr.map(v => v * 2);
}
// 리액트 컴포넌트
<Btn
  onToggleHighlight={this.handleToggleHighlight}
  highlight={this.state.highlight}>
    {this.state.buttonText}
</Btn>

// 리액트의 장점은 선언적인 방식으로  UI를 만들 수 있다는 것이다.


어떠신가요? 이제 명령형과 선언형에 대해서 감을 잡으셨나요? 어렵게 생각하실 필요 없습니다.


예를 들어

  • 명령형은 선생님이 말 안 듣는 제자들에게 좋은 사람이 되기 위해서 어떻게 살아야하는지 방식을 설명하는 것 과 같고,
    1. 민지 넌 어떻게 맨날 놀기만 하니.. 훌륭한 사람이 되기 위해선 어떻게 어떻게 해야하고... 너가 갖고 있는 장점이 무엇인데 그 장점을 잘 활용해서 좋은 사람이 되어야 하지않겠어??..

  • 선언형은 선생님이 모범적인 학생에게 "넌 좋은 사람(WHAT)이 될거야"라고 말하는 것과 같다고 볼 수 있습니다.
    1. 길동이 넌 평소 언행이 착실해서 넌 좋은 사람이 될거야.
    2. 개똥이 넌 머리가 뛰어나니까 좋은 사람이 될거야.
    3. 민수 넌 사람들을 도와주는 걸 좋아하니까 좋은 사람이 될거야.



그렇다면 무엇이 좋을걸까(feat. 재사용성💬)

프로그래밍 패러다임에 대해서 딱 잘라 이 방법이 좋다!😏 라고는 말할 수는 없다고 생각합니다.

  • 단 위의 예시를 보면 알 수 있듯이 for문을 이용한 방법보다, forEach메서드를 이용한 방식이 더 깔끔하고 직관적인 코드였다는 것을 알 수 있을 것입니다.
  • 명령형은 아무래도 데이터 중심이니 재사용 측면에서 좋지 못하다고 볼 수 있습니다. 리액트의 컴포넌트(선언형)가 유용한 이유는 재사용 측면에서 뛰어나기 때문입니다.
  • 선언형에서 코드의 양이 줄어드는 것을 보았을 때, 변수와 함수명을 의미 있게 지어주지 않으면 오히려 악효과가 나타날 수 도 있을 것 같다는 생각도 드네요.


🐯 마치며

프로젝트의 크기에 따라 절차적 프로그래밍으로만 만들어진 코드는 스파게티 코드일 가능성이 많습니다. 가변적 데이터들이 정말 많다면 유지보수 측면에서 많은 cost를 소모할 것이라고 생각이 듭니다.
반면 선언형 프로그래밍은 훨씬 직관적이고 재사용면이 뛰어나기 때문에 엄청난 이점을 가질 수 있다고 생각이 드네요.

🧑‍💻 참고

명령형 프로그래밍 vs 선언형 프로그래밍
프로그래밍 패러다임에 대해

profile
하루에 한 가지의 변화를 만들자.

0개의 댓글