선언형 프로그래밍 vs 명령형 프로그래밍

2020. 10. 17. 22:53코딩/프로그래밍 기타

명령형 프로그래밍은 "어떻게"를 설명하는 것이고,

선언형 프로그래밍은 "무엇을"을 설명하는 것이다.

 

이 설명을 보고 이해가 되었다면 더 이상의 설명은 필요없다 하산(뒤로가기)하자.

 

 

 

선언형 프로그래밍과 명령형 프로그래밍

 

선언형 프로그래밍이란 선언적 구문을 통해 프로그래밍하는 것이다. 

선언적 구문이란 한글은 이해는 되지만 프로그래밍적으로 어떤 의미인지는 다소 어렵다.

선언형 프로그래밍(Declarative Programming)을 간단히 이해해보자.

프로그래밍을 배운 경험이 있다면 어떤 언어를 배우던 99%는 명령형 프로그래밍을 배우게 될 것이다.

 

또 모르는 용어가 나왔을 수도 있다. 명령형 프로그래밍?

먼저 명령형 프로그래밍과 선언형 프로그래밍을 구분해보자.

 

처음한 설명을 좀더 풀어서 설명하면

명령형 프로그래밍은 컴퓨터가 어떻게 행동해야 하느지를 프로그래밍하는 것이고,

선언형 프로그래밍은 컴퓨터가 무엇을 해야할지를 프로그래밍 하는 것이다.

 

모두가 좋아하고 쉽게 이해할 수 있게 게임을 예로들어보자.

몬스터를 잡는 함수를 만든다고 가정해보자.

C++을 갖고 명령형으로 작성된 의사코드다. 

void KillMonster(고블린)
{
    while(true)
    {
        if (고블린의 거리 > 사정거리){
          고블린방향으로 1만큼 이동
        }
        else{
	  고블린 공격
        }

        if (고블린 사망){
	  break;
        }
    }
}

여기서도 다소 선언적 요소가 들어가 있지만,

컴퓨터는 시키는대로 행동하기 때문에 모든 행동을 코드로 짜넣어야 한다.

몬스터로 이동, 공격, 판단 모두 프로그래머가 짜넣어야 한다.

 

반면 선언적 프로그래밍에서는 이러한 과정이 필요없다.

선언적 프로그램이라 가정하고 코드를 작성해보자.

void KillMonster()
{
	몬스터사냥(고블린)
}

이걸 코드라고 해야할지 고민될 정도로 단순해졌다.

몬스터 사냥이라는 코드를 넣으니

가서 몬스터를 찾아가서 공격하고 스킬쓰고 아이템까지 획득한다.

모바일게임의 자동사냥을 생각하면 쉽다.

개념적으로 이렇다는 것이지 실제 코드가 이렇다고 생각은 하지말자.

 

이것만 보면 선언형 프로그래밍은 참 쉽다.

인간의 사고와 매우 비슷한 방식으로 구동되기 때문에

프로그래밍적 사고를 배울 필요도 없을 것 같다.

 

어 잠깐. 어디서 외침이 들려온다.

 

아니! 저런 코드를 가지고 프로그래밍을 배우면 참 코딩실력이 늘겠다!

프로그래머라면 당연 컴퓨터적으로 생각하고 컴퓨터를 이해해야지!

라떼는 말야 프레임워크도 만들어서 쓰고...!

 

흠... 맞는말이다.

솔직히 필자도 잠깐 이런생각을 했다. (라떼부분 빼고...)

 

사실 저런 선언적 프로그래밍 구문은 다른 똑똑하신 프로그래머들이 추상화시켜서

프로그래밍이 되어있기 때문에 가능한 일이다.

실제로는 명령형 구문이 뒤에서 돌아가고 있다고 생각해도 무방하다.

 

프로그래밍은 컴퓨터가 돌아가는 방법을 만드는 것인데 저런 명령형 구문은

컴퓨터에 대한 이해가 없어도 코드작성이 가능해진다는 장점이 있다.

하지만 이 장점은 그대로 컴퓨터가 도는 방식을 모르는 프로그래머라는 단점이 되어버린다.

 

하지만 생각해보니 이건 꼰대적 발상이 아닌가 싶기도 하다.

과거 어셈블리로 코딩하시던 분들이 C언어를 보고 이런생각을 하지 않았을까?

더 과거로가서 컴퓨터에 전선 꽂으면서 코딩하던 분들이 어셈블리를 보고 이런 생각을 하지 않았을까?

 

컴퓨터가 돌아가는 방식만 이해하고 사용한다면 열줄, 몇십줄의 코드를 한줄로 줄여줄 수 있는

획기적 방법이 아닌가 싶기도 하다.