Hope Everyone Is Happy

1 프로그래밍 패러다임 & 선언형과 함수형 프로그래밍 본문

※ CS 스터디/프로그래밍 패러다임

1 프로그래밍 패러다임 & 선언형과 함수형 프로그래밍

J 크 2023. 8. 9. 01:41
728x90
반응형

본 게시글은  : 면접을 위한 CS 전공지식 노트 (출판사 : 길벗, 주홍철 지음) 을 참조하여 작성하였습니다. + 구글링


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

- MVC 프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론

        ex) : 객체지향 프로그래밍 - 프로그래머들이 프로그램을 상호 작용하는 객체들의 집합을 관점으로 설계

              : 함수형 프로그래밍 - 상태 값을 지니지 않는 함수값들의 연속을 중심으로 설계

- 서로 다른 프로그래밍 언어는 서로 다른 프로그래밍 패러다임을 지원

- 어떤 언어는 특정한 패러다임을 지원

        ex) : Java = 객체 지향 프로그래밍 (jdk 1.8 이전의 Java)

               : 하스켈 =  함수형 프로그래밍

- 여러 패러다임을 지원하는 언어 :

        ex) : C++, Python, JavaScript, Java (jdk 1.8 이후)

- Java는 함수형 프로그래밍 패러다임을 지원하기 위해 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입, 스트림 같은 API도 추가

- 프로그래밍 패러다임은 크게 선언형, 명령형으로  나눌 수 있으며, 선언형은 함수형이라는 하위 집합을 가지며, 명령형은 다시 객체지향, 절차지향으로 구분



◆  선언형 프로그래밍 (declarative programming  ) 

- 선언형 프로그래밍이란 '무엇을' 풀어내는가에 집중하는 패러다임 

- 또한 "프로그램은 함수로 이루어진 것" 이라는 명제가 담겨있는 패러다임- 함수형 프로그래밍은 선언형 패러다임의 일종


◆  함수형 프로그래밍 (functional programming  ) 

- '순수 함수' 들을 블록처럼 쌓아 로직을 구현하고 '고차 함수'를 통해 재사용성을 높인 프로그래밍 패러다임

- JavaScript는 단순하고 유연한 언어로, 함수가 일급 객체이기 때문에 객체지향 프로그래밍 보다는 함수형 프로그래밍 방식을 선호

- 순수 함수 : 출력이 입력에만 의존 하는 함수 

// 순수 함수 (Java)
int addInteger(int num1, int num2) {
	return num1 + num2;
}

 

      :  num1 + num2 라는 출력은 반드시 매개변수 num1, num2로 인해서만 영향을 받음 (순수 함수 O)

static int num3 = 2;

// 순수함수가 아님 (Java)
static int addInteger(int num1, int num2) {
	return num1 + num2 + num3;
}

     : 출력에 + num3가 끼어들면서 함수 외부에서 영향을 받으므로 순수함수 X

- 고차 함수 : 함수를 매개로 받거나 반환하여 로직을 생성

// Javascript
function double(num) {
	return num * 2;
}

// 고차 함수
function doubleNum(func, num) {
	return func(num);
}

let output = doubleNum(double, 4);
console.log(output); // 8

   : doubleNum함수가 double함수를 매개로 받아 사용

 

 

- 일급 객체 : 고차 함수를 쓰기 위해서는 해당 언어가 일금 객체라는 특징을 가져야함

      : 변수나 메서드에 함수를 할당 가능

      : 함수 안에 함수를 매개변수로 사용 가능

      : 함수가 함수를 반환 가능


 본인은 C++을 주로 공부를 해왔고 최근엔 Java를 공부 중이라 객체지향 프로그래밍을 설계하고 이해하는 것이 더 중요하다고 생각되어서 함수형 프로그래밍에 대해서는 간략하게 알아보았습니다.

 위의 글과 관련하여 추가적인 내용이나 피드백은 언제나 환영입니다 :)