평소에 작성하던 코드가 선언형이었다는 것을 패러다임을 공부하면서 알게 됐습니다.
프로그래밍 패러다임이란 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할 지 결정하는 역할을 한다. 새로운 프로그래밍 패러다임을 통해서 이전과는 다른 방식으로 생각해보고, 낯선 코드를 작성할 수 있는 기회가 생겼다는 건 정말 축복이다! (고이는 건 프로그래머에게 죄악이기 때문에?)
최근 프로그래밍 패러다임은 크게 명령형 명령형 프로그래밍, 선언형 프로그래밍으로 구분지을 수 있다.
문제를 어떻게(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를 만들 수 있다는 것이다.
어떠신가요? 이제 명령형과 선언형에 대해서 감을 잡으셨나요? 어렵게 생각하실 필요 없습니다.
예를 들어
- 민지 넌 어떻게 맨날 놀기만 하니.. 훌륭한 사람이 되기 위해선 어떻게 어떻게 해야하고... 너가 갖고 있는 장점이 무엇인데 그 장점을 잘 활용해서 좋은 사람이 되어야 하지않겠어??..
- 길동이 넌 평소 언행이 착실해서 넌 좋은 사람이 될거야.
- 개똥이 넌 머리가 뛰어나니까 좋은 사람이 될거야.
- 민수 넌 사람들을 도와주는 걸 좋아하니까 좋은 사람이 될거야.
프로그래밍 패러다임에 대해서 딱 잘라 이 방법이 좋다!😏 라고는 말할 수는 없다고 생각합니다.
프로젝트의 크기에 따라 절차적 프로그래밍으로만 만들어진 코드는 스파게티 코드일 가능성이 많습니다. 가변적 데이터들이 정말 많다면 유지보수 측면에서 많은 cost를 소모할 것이라고 생각이 듭니다.
반면 선언형 프로그래밍은 훨씬 직관적이고 재사용면이 뛰어나기 때문에 엄청난 이점을 가질 수 있다고 생각이 드네요.