프로그래밍 패러다임(Programming Paradigm)

개발자들은 항상 고민한다 ' 어떻게 하면 좀더 좋은 프로그래밍을 할수있을까? '

여기에서 부터 시작된 프로그래밍 패러다임은 프로그래밍을 하나의 관점과 방식으로 꾸려나가는것을 프로그래밍 패러다임 이라고 합니다

 

사실 우리는 알게모르게 프로그래밍 패러다임을 접목시켜서 개발하고있습니다

바로 절차지향 프로그래밍과 객체지향 프로그래밍이 두가지 패러다임을 가장 흔하게 사용할것입니다

우리는 여기에 함수형 프로그래밍을 추가시켜 3가지의 프로그래밍 패러다임의 특징을 보고 장단점을 확인하며, 우리가 소프트웨어 개발에있어서 어떤 패러다임을 적용시킬지, 아니면 내가 좀더 편하게 잘할수있는 방법을 알아갔으면 좋겠습니다

 

여러 관점의 프로그래밍을 보기전에 우리는 크게 2개의 프로그래밍을 알아볼것인데 첫번째로 명령형 패러다임, 그뒤에 선언형 패러다임을 알아보고, 이것들을 기초로 어떤 프로그래밍방법이 있는지 알아보도록 하자

 

 

 

 

 

 

명령형 패러다임(Declerative)


 

명령형 패러다임, 명령형 프로그래밍은 말그대로 문제를 해결하기위해서 컴퓨터에게 명령을 내리는 방법의 프로그래밍을 뜻한다

우리는 문제의 대한 해결법을 제시하고 컴퓨터에게 이렇게해! 라고 말하는 것이다

대표적으로 절차지향 프로그래밍과 객체지향 프로그래밍이 있으며, 예시를 통해서 정확히 뭔지 알아보도록 하자

 

List<Integer> lists = new ArrayList<>();

list.add(1);
list.add(2);

for (int list : lists) {
	if(list == 1) {
    	System.out.println(list);
    }
}

 

간단하게 정수형 타입을 모아놓은 list를 선언하고 해당 안에있는 값중 1을 출력하는 프로그램이 있다고 가정해보자

명령어는 위에서 부터 아래로 쭉 읽어나가면서 순차적으로 문제해결을 할것이다

list를 만들고... 숫자 1, 2를 넣고... 아! 그다음 루프를 돌면서 list에있는 값이 1이면 출력하라것이구나.. 라고 컴퓨터는 이해할것이다

 

이처럼 우리는 컴퓨터에게 이렇게해! 라고 명령을 내려서 문제를 해결하며, 절차적 프로그래밍 즉 위에서부터 아래로 순차적으로 ' 명령 ' 을 수행한다는 것을 확인할수있다

절차지향 프로그래밍의 장점은 물이 흐르듯이 프로그래밍을 하면되기때문에 비교적 배우기쉬우며, 논리적인 사고를 기르기에 좋다, 즉 초보자의 접근성이 좋다고 볼수있다

 

하지만 프로그램이 조금이라도 길어진다면 유지보수에 불편하다(순서가 꼬이면 오류가 발생할 확률이높다)

C언어가 대표적인 절차적 프로그래밍 언어에 속한다고 보면된다

 

그다음 명령형 프로그래밍의 속하는 객체지향 프로그래밍에 대해서 알아보도록 하자

우리가 가장 많이 접하고 대중적으로 사용하는 객체지향 프로그래밍은 최소의 단위를 객체로 쪼개 객체를 만들고, 객체를 사용하여 메소드를 만들며, 데이터를 넣는 객체중점으로 프로그래밍 하는 방식이다

 

JAVA, C#이 대표적인 객체지향 프로그래밍 언어로써 직관적이면서 유지보수가 쉽다는 장점을 가지고있다

하지만 설계의 난이도가 비교적 어려운편이며, 잘못설계할시 오류를 해결하기 불편하다는 점이있다

 

public class ProblemOptionDTO {

    private String use;
    private String order;
    private String category;
    private String level;
    private String lang;
    private String etc;

    public ProblemOptionDTO() {}


    public ProblemOptionDTO(String use, String order, String category, String level, String lang, String etc) {
        if (lang.equals("KR")) {
            this.lang = "한국어";
        }

        if (lang.equals("ENG")) {
            this.lang = "영어";
        }

        if (lang.equals("total")) {
            this.lang = "total";
        }

        this.category = category;
        this.use = use;
        this.order = order;
        this.level = level;
        this.etc = etc;
    }

}

 

객체지향 프로그래밍도 결국 최소단위를 객체로 관리하지만 결국 컴퓨터에게 해결방법을 ' 명령 ' 한다는것은 변하지않는다

 

 

 

 

 

 

 

선언형 패러다임(Imperative)


선언형 프로그래밍은 대표적으로 함수형 프로그래밍이있으며, 명령형은 우리가 해결방법을 제시해줬다면, 선언형 프로그래밍을 무엇을 어떻게 해결해야는지 고민하며 이를 컴퓨터에게 위임하는 형태이다

 

예를들어 우리가 호텔에 예약을잡고 방을찾아갈때 첫번째로 ' 앞으로 쭉 가셔서 코너를 돌아서 나오는 첫번째방이 201호입니다 ' 라는것과 (명령형) ' 201호 방에서 묵으시면 될거같습니다 ' (선언형) 처럼 해결방법을 명령을통해 우리가 제시하는것이아닌 컴퓨터에게 위임하는 방법이라고 생각하면된다

 

        List<Integer> list = new ArrayList<>();

        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);

        list.stream().filter( (item) -> item % 2 == 0)
                .forEach( (item) -> {
                    System.out.println("item = " + item);
                });

 

 

list에 1, 2, 3, 4를 담고 짝수인 item을 출력하는 문법이다

명령형과 다른점은 직접 루프문을 돌려서 ' 이렇게해! ' 라고 명령하는 것이아니라 우리는 그냥 함수를 선언해주면 해당 선언문에서 결과값을 도출해서 알려준다

 

즉 함수형 프로그래밍은 최소단위가 함수면서 함수가 파이프의 형태로 이어져있다면 데이터를 만들어가면서 프로그래밍하는 방식을 함수형 프로그래밍이라고 한다는것이다

 

함수형 프로그래밍에는 몇가지 특징있는데 해당 특징에 대해서는 다음 게시물을 통해서 자세히 알아보도록하자

 

 

 

 

 

 

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


명령형 프로그래밍에 대표적인 방법은 2가지 절차지향, 객체지향이 있으며 컴퓨터에게 명령하여 문제를 해결하는 방식을 말한다

 

선언형 프로그래밍에는 함수형 프로그래밍이 있으며 컴퓨터에게 명령을 하는것이 아닌 문제를 어떻게 해결하는지 제시하고 해결방법은 컴퓨터에게 맡긴다