Thief of Wealth

주의) 여러 글들을 짜집기하여 정리한 글임.

 

- 명령형

: 어떻게 풀어내는지에 집중 (how)

 

- 선언형

: 무엇을 풀어내는지에 집중 (what)

 

예를들어서 최종적인 목표가 "물을 마시기"라고 해보자.

 

명령형: 어떻게 (how) 할 것인지를 설명

1. 자리에서 일어난다.

2. 부엌으로 이동한다.

3. 컵과 물을 찾는다.

4. 컵에 물을 부어 마신다.

 

선언형: 무엇 (what)을 할 것인지를 설명

1. 물을 마셔보자

 

- 명령형 프로그래밍: 프로그래밍의 상태, 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식

    - 절차지향 프로그래밍 : 수행되어야할 연속적인 계산 과정을 포함하는 방식

    - 객체지향 프로그래밍 : 객체들의 집합으로 프로그램의 상호작용을 표현

- 선언형 프로그래밍: 어떤 방법으로 해야하는지를 나타내기보다, 무엇과 같은지를 설명하는 방식

    - 함수형 프로그래밍: 순수 함수를 조합하고 소프트웨어를 만드는 방식

 

- 명령형 프로그래밍의 단점

명령형 프로그래밍은 상태 변화로 인해 side effect가 존재한다.

 

- 명령형과 선언형은 사고 방식이 다르다.

: 명령형 프로그래밍은 문제를 어떻게 해결해야하는지 컴퓨터에게 명시적으로 명령을 내리는 방법을 의미하고,

선언형 프로그래밍은 무엇을 해결할 것인지에 보다 집중하여 어떻게 문제를 해결하는지에 대해서는 컴퓨터에게 위임하는 방법이다.

 

처음 프로그래밍이라는 개념이 등장했을 떄부터, 지금까지도 컴퓨터에게 명시적으로 명령을 내리는 방법인, 명령형 프로그래밍을 주로 사용했지만, 함수형 프로그래밍은 문제를 해결하는 방법에 더 집중하고, 사소한 작업은 컴퓨터에게 넘겨버리는 선언형 프로그래밍의 일종이다.

 

즉, 컴퓨터에게 사소한 작업들을 위임해버리는 패러다임의 특성 상, 선언형 프로그래밍에는 필연적으로 높은 수준의 추상화라는 키워드가 붙는다. 추상화 수준이 낮다면 저 사소한 작업들을 개발자가 일일이 다 컨트롤해야한다는 의미이기 떄문이다.

 

ex) 배열을 순회하여 빈 문자열을 걸러내고, 각 원소의 첫 글자를 대문자로 변환해라

 

- 명령형 프로그래밍의 해법 (어떻게 해결할까?)

const newArr = [];
for(let i=0; i<arr.length; i++){
	if(arr[i].length !== 0){
    	newArr.push(arr[i].charAt(0).toUpperCase() + arr[i].substring(1))
    }
}

저 for문을 이용하여 특정 행위를 반복하는 코드는 누구나 작성할 수 있을 정도로 익숙한 로직인데, 저 안을 들여다보면 다음과 같은 동작이 수행된다.

1. i를 0로 초기화

2. i가 arr배열의 길이보다 작다면 구문을 반복 실행

3. for문 내부의 코드의 실행이 종료될 때마다 i에 1더하기

4. arr배열읠 i번째 요소에 접근

5. 만약 원소의 길이가 0이 아니면, 원소의 첫 번째 글자를 대문자로 변경

6. 이렇게 합쳐진 문자열을 newArr에 push

 

- 선언형 프로그래밍의 해법 (무엇을 해결할까?)

function convert(str) {
	return str.charAt(0).toUpperCase() + s.substring(1);
}

const newArr2 = arr.filter(v => v.length !== 0).map(v => convert(v))

1. 인자로 받은 문자열의 첫글자만 대문자로 변경하는 함수를 선언

2. arr배열에서 원소의 길이가 0이 아닌 것들을 걸러냄

3. 걸러진 배열을 순회하면서 1번에서 선언한 함수를 사용해서, 첫글자를 대문자로 변경

 

물론 위 2가지의 내부 흐름은 같게 동작하지만, 자잘한 인덱스변수나 관리에 대해서는 생각할 필요가 없어졌고,

해결해야하는 문제 (배열을 순회하여 걸러내고, 각 원소의 첫 글자를 대문자로 변경해라)와 사고 방식의 흐름이 비슷해진 것을 알 수 있다.

걸러내고 (filter) + 대문자로 변경 (covert + map)

 

 

profile on loading

Loading...