본문 바로가기
General

명령형 코드 vs 선언형 코드

by whatamigonnabe 2022. 8. 25.

자바를 공부하면서, 함수형 프로그래밍 언어의 인기가 높아지고 있고 객체지향 언어인 자바 진영에서도 이를 적용할 수 있는 Lamda 기술을 도입했다는 것을 배웠습니다. 그때는 그냥 그런가보다 하고 넘어갔는데, 최근에 이것이 단순히 어떤 기술이 아니라, 코드를 작성하는 일종의 '스타일'로도 볼 수 있다는 것을 알게되어 상당히 의미있게 다가와서 정리를 하게 됐습니다.

 

명령형 코드 vs 선언형 코드

명령형 코드는 어떻게 일을 할지 'HOW'에 집중하는 것이고, 선언형 코드는 'WHAT'에 집중하는 것입니다. 간단하게 코드 예제로 살펴보겠습니다.

//명령형
public static void main(String[] args) {
    int[] arr = {1, 2, 3, 4, 5};
    int min = arr[0];
    for(int i = 1; i < arr.length; i++) {
        if(arr[i] < min) {
            min = arr[i];
        }
    }
    System.out.println(min);
}
    //선언형
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int min = min(arr);
        System.out.println(min);
    }

둘 다 최소값을 도출하기 위한 코드이지만, 위의 코드는 어떻게 진행해야하는지 모두 설명하고 있어 한번에 파악하기가 쉽지 않습니다.

반면, 아래 코드는 'min'이라는 함수로 해야할 일을 정의해두고 사용하고 있어, 그 함수의 이름으로 의도를 쉽게 파악할 수 있어 전체적인 코드를 이해하는데 훨씬 수월합니다. 

선언형 코드는 읽고 싶은 코드를 만드는 방법이다.

 

멱등성

선언형 코드에 대해서 한 가지 더 알아볼 것이 있습니다. 함수형 프로그래밍은 '멱등성'을 지켜야합니다. 멱등성이란 몇 번을 함수를 사용해도 같은 결과를 도출하는 성질을 뜻하는데요, 예시를 들어보겠습니다.

 

timer(10);

 

위와 같이 입력 받은 시간 만큼 타이머를 설정하는 함수를 만든다고 할 때, 만약 현재 남은 시간에서 입력받은 시간만큼 더해서 타이머를 설정한다고 한다면, 멱등성이 없는 것입니다. 함수를 호출할 때마다, 결과가 달라지니까요. 반면, 남은 시간이 얼마이든 상관 없이, 입력값만큼 시간을 설정한다면, 멱등성이 있는 것입니다.

 

다만, 이것은 함수의 의도에 따라 다릅니다. 만약 이 함수의 의도가 입력한만큼 시간을 더하는 타이머라면, 함수를 호출할 때마다 같은 시간을 더하게 되는 것이니 결과가 같다고 볼 수도 있습니다.

 

 

정리

명령형이 훨씬 읽기 싫게 생겼고, 선언형은 뭔가 읽고싶습니다. 이것이 선언형 코드의 핵심인 것 같습니다. 함수형 프로그래밍을 사용하지 않을 때에도 이를 최대한 적용해본다면, 상당히 읽고싶은 코드를 만들 수 있을 것 같습니다. 결국 코딩은 유지 보수를 용이하게 하는 것이 중요하니까요.

 

 

참조

https://ko.wikipedia.org/wiki/%EC%84%A0%EC%96%B8%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

https://blog.hoseung.me/2022-08-23-imperative-declarative-abstract/