면접에서 구조적으로 코드를 작성하는걸 좋아한다고 했더니 그럼 선언적 프로그래밍이 뭔지 아는지 질문을 받았다. 명확히 설명하지 못하지 못하는건 모르는 것이라고 생각해서 모른다고 답변을 드렸고... 다음에는 대답할 수 있도록 정리해보려고 한다.
명령형 프로그래밍은 일을 어떻게 할 것인가에 집중하고, 선언적 프로그래밍은 무엇을 할것인가에 집중한다.
Q. OO에서 XX까지 가려면 어떻게 해야할까요?
명령형: A거리에서 좌회전한 뒤 B까지 직진 한 뒤 C고속도로를 타고 D까지 온 뒤에 우회전 하면 됩니다.
선언형: XX의 주소는 ‘OOOOO’입니다.
Q. 배열의 원소들에 2배를 하는 방법
//명령형
const double=(arr)=>{
let result=[];
for (let i=0; i<arr.length; i++){
result.push(arr[i]*2);
}
return result;
}
//선언형
const double=(arr)=>{
return arr.map((num)=>num*2);
}
// 명령형
$("#btn").click(function() {
$(this).toggleClass("highlight")
$(this).text() === 'Add Highlight' ?
$(this).text('Remove Highlight')
: $(this).text('Add Highlight')
})
//선언형
<Btn
onToggleHighlight={this.handleToggleHighlight}
highlight={this.state.highlight}>
{this.state.buttonText}
</Btn>
명령형 프로그래밍은 원하는 결과를 얻기위해 코드를 작성해나가는 방식이다. 코드 안에서 어떤 일이 벌어지고 있는지 한 눈에 알기 어렵다. 보통 단계적으로 상태가 어떻게 변화할 지 예측하면서 읽어야 한다.
코드를 선언적으로 짠다고 하면, 무엇이 발생하는지에 집중해야하고, state를 변경하지 않으며 한 눈에 읽을 수 있어야 한다. 명령형 코드들은 특정한 목적에 따라 작성되는 경우가 많으므로 재사용 되기 어렵다.
선언적 프로그래밍은 ‘어떻게’에 관심을 두지 않기 때문에 함수가 하는 일은 추상화되어진다. 위의 코드 예제에서도 명령형은 for문으로 원소들을 순회하며 2배를 하겠다는 방법이 제시되어 있지만, 선언형은 map이 어떻게 동작하는지는 보여주지 않고 원소들을 2배 시킨다.
코드를 작성할 때
솔직히 명령형 프로그래밍에 관련해서 글을 읽으면서..내 코드 아닌가?!라는 생각을 많이 했다...ㅎ C++로 코테를 준비하다보니 명령형에 익숙해져버린것 같은데 선언적으로 쓸 수 있도록 노력해야겠다.🥺