본문 바로가기
Web Development/Front End 관련 개념 정리

프로그래밍 패러다임 | Part1. 선언형과 함수형 프로그래밍

by Krystal K 2023. 12. 18.

프로그래밍 패러다임 | Part1. 선언형과 함수형 프로그래밍

[index]

intro 프로그래밍 패러다임

1. 프로그래밍 패러다임(Programming Paradigm)이란?

2. 프로그래밍 패러다임의 분류

 

Part.1 선언형과 함수형 프로그래밍

1 선언형 프로그래밍(Declarative Programming)이란?

2. 함수형 프로그래밍이란?

  • 2-1. 함수형 프로그래밍의 정의
  • 2-2. 함수형 프로그래밍의 특징
  • 2-3. 함수형 프로그래밍의 장점
  • 2-4. 함수형 프로그래밍의 단점
  • 2-5. 함수형 프로그래밍의 중요성 

3. 마무리


 

intro 프로그래밍 패러다임

1. 프로그래밍 패러다임(Programming Paradigm)이란?

프로그래밍 패러다임이란 프로그래밍의 관점을 갖게 하는 개발 방법론입니다. 일부 프로그래밍 언어를 사용하여 문제를 해결하는 접근 방식이거나 일부 접근 방식에 따라 사용할 수 있는 도구 및 기술을 사용하여 문제를 해결하는 방법이라고 말할 수도 있습니다. 프로그래밍 패러다임은 프로그래머가 코드에 대해 어떻게 생각하고 구조화해야 하는지를 규정합니다. 이는 프로그램 작성 방식, 문제 해결에 사용되는 기술 및 전반적인 디자인 철학에 영향을 미칩니다. 다양한 패러다임에는 장단점이 있으며, 특정 작업에 적합한 패러다임을 선택하면 프로그램의 효율성, 유지 관리성 및 확장성에 큰 영향을 미칠 수 있습니다.

 

2. 프로그래밍 패러다임의 분류

 

 

Part.1 선언형과 함수형 프로그래밍

1. 선언형 프로그래밍(Declarative Programming)이란?

선언형 프로그래밍은 '어떻게'가 아닌 '무엇을' 풀어내는가에 집중하는 패러다임입니다. 이것이 명령형(어떻게 해야 하는지) 프로그래밍 패러다임과 선언적(무엇을 해야 하는지) 프로그래밍 패러다임 사이의 유일한 차이점입니다. 로직, 기능, 데이터베이스로 구분됩니다. 컴퓨터 과학에서 선언적 프로그래밍은 제어 흐름에 대해 언급하지 않고 계산 논리를 표현하는 프로그램 작성 스타일입니다. 선언형 프로그래밍의 종류로는 논리 프로그래밍 패러다임,함수형 프로그래밍 패러다임 등이 있습니다.

 

2. 함수형 프로그래밍(Functional Programming)이란?

2-1. 함수형 프로그래밍의 정의

함수형 프로그래밍은 선언형 프로그래밍의 일종으로, 모든 것을 순수한 함수 스타일로 묶으려고 하는 프로그래밍 패러다임입니다. 작은' 순수함수'를 블록처럼 쌓아 로직을 구현하고 '고차 함수'를 통해 재사용성을 높입니다. 

 

순수 함수란?

항상 동일한 인수에 대해 동일한 출력을 생성합니다. 순수 함수의 유일한 결과는 반환하는 값입니다. 또한 사이드 이펙트가 존재하지 않습니다. 

 

아래의 예시 코드를 통해 다시 한번 정리해보겠습니다.

const sum = (a,b) => {
	return a+b
}

 

sum이라는 함수는 파라미터로 a와b를 받고 있습니다. 그리고 a와b를 더해서 반환합니다. 이때 sum은 a와 b의 변경하거나, a와b의 합을 변경하지않고 그대로 반환합니다. 이처럼 값을 내부에서 변경하지 않고 그대로 반환하며 외부에 영향을 끼치지 않는 함수입니다.

 

 

고차 함수란?

함수를 값처럼 인수로 받아 로직을 생성하거나 함수를 반환하는 함수를 고차함수라고 합니다.

 

함수형 프로그래밍을 사용하여 수행된 프로그램은 순수 함수에 사이드 이펙트나 숨겨진 I/O가 없기 때문에 디버그하기 쉽습니다. 순수 함수를 사용하면 병렬/동시 애플리케이션 작성도 더 쉬워집니다. 코드가 이 스타일로 작성되면 스마트 컴파일러는 많은 작업을 수행할 수 있습니다. 명령을 병렬화하고, 필요할 때 결과를 평가할 때까지 기다릴 수 있으며, 입력이 변경되지 않는 한 결과는 절대 변경되지 않으므로 결과를 기억할 수 있습니다. 

 

2-2. 함수형 프로그래밍의 특징

함수형 프로그래밍은 주로 선언적인 스타일을 강조하며, 상태 변이나 가변 데이터를 피하고 불변성을 지향합니다. 데이터는 생성 후 변경되지 않으며, 필요한 경우에는 새로운 데이터를 생성합니다. 새로운 변수를 생성할 수 있지만 기존 변수를 수정할 수는 없으며 이는 프로그램 런타임 전체에서 상태를 유지하는 데 큰 도움이 됩니다. 이로 인해 코드의 예측 가능성이 높아지고 부작용을 줄일 수 있습니다. 따라서 동일한 입력에 대해서 항상 동일한 출력을 얻을 수 있어 프로그램의 안정성을 높이고 디버깅을 쉽게 만듭니다.

 

선언적인 스타일은 '무엇을(What)'을 달성하는지에 중점을 두고 '어떻게(How)'를 명시적으로 표현하는 것을 의미합니다. 이는 코드의 가독성을 향상시키고 의도를 명확하게 전달할 수 있게 합니다. 또한, 선언적인 코드는 코드의 재사용성을 높여주어 유지보수에 용이하게 합니다.

 

함수형 프로그래밍에서는 순수한 리커전을 선호하며 이를 통해 코드를 간결하게 작성하고 명확하게 표현합니다. 이러한 특징들은 안정성과 가독성을 높이며, 병렬 처리와 동시성을 쉽게 다룰 수 있는 장점을 제공합니다.

자바스크립트는 단순하고 유연한 언어이며,
함수가 일급 객체이기 때문에 객체지향 프로그래밍보다 함수형 프로그래밍을 선호한다.

 

간단하고 유연한 언어란 코드를 쉽게 작성하고 이해할 수 있으며, 필요한 경우 언제든지 코드를 수정하거나 확장할 수 있다는 것을 의미합니다. 이는 프로그래머에게 편의성을 제공하며, 코드 작성과 유지보수를 더욱 효율적으로 만듭니다.

 

또한, 함수가 일급 객체(일급 함수)라는 말은 함수를 변수에 할당하거나 함수의 매개변수로 전달하고 반환할 수 있다는 것을 의미합니다. 이로 인해 함수를 다루는데 있어서 자유로움과 편리함을 얻을 수 있습니다.

 

일급 객체(일급 함수)란?

고차 함수를 쓰기 위해서는 해당 언어가 일급 객체라는 특징을 가져야 합니다.

  • 변수나 메서드에 함수를 할당할 수 있습니다.
  • 함수 안에 함수를 매개변수로 담을 수 있습니다.
  • 함수가 함수를 반환할 수 있습니다.

 

이러한 특징들로 인해 자바스크립트에서는 객체지향 프로그래밍 대신 함수형 프로그래밍을 선호하는 경우가 많습니다. 함수형 프로그래밍은 데이터를 다루고 변환하는 데에 강점을 가지며, 이는 코드를 간결하고 유연하게 만들어줍니다. 따라서 자바스크립트에서 함수형 프로그래밍을 사용함으로써 더욱 효과적으로 코드를 작성하고 관리할 수 있습니다

 

2-3. 함수형 프로그래밍의 장점

  1. 불변성과 예측 가능성 (Immutability and Predictability)
    데이터의 불변성은 예측 가능하고 안정적인 코드를 작성할 수 있게 해주며, 버그 발생을 줄여줍니다.
  2. 병렬 처리 및 동시성 (Parallelism and Concurrency)
    불변성과 순수 함수를 통해 상태 변화가 없기 때문에 병렬 처리와 동시성을 쉽게 다룰 수 있습니다.
  3. 모듈화와 재사용성 (Modularity and Reusability)
    함수형 프로그래밍은 모듈화와 함수의 재사용성을 촉진하여 코드를 간결하게 유지할 수 있습니다.
  4. 테스트 용이성 (Ease of Testing)
    순수 함수는 입력과 출력만 고려하면 되므로 테스트가 간편하며 테스트 커버리지를 높일 수 있습니다.
  5. 표현력과 가독성 (Expressiveness and Readability)
    함수형 코드는 간결하고 표현력이 높아 가독성이 좋습니다.

 

2-4. 함수형 프로그래밍의 단점

  1. 학습 곡선 (Learning Curve)
    함수형 프로그래밍은 다른 패러다임과는 다른 접근법을 채택하기 때문에 초보자에게는 학습 곡선이 높을 수 있습니다.
  2. 성능 오버헤드 (Performance Overhead)
    일부 경우에는 함수형 프로그래밍이 불필요한 객체 생성과 함수 호출로 인해 성능 오버헤드가 발생할 수 있습니다.
  3. 적은 생태계 (Smaller Ecosystem)
    몇몇 언어들에서는 함수형 프로그래밍을 지원하는 라이브러리가 상대적으로 적을 수 있습니다.
  4. 상태 변화 처리 (Handling State Changes)
    일부 애플리케이션에서는 상태 변화를 다루는 데 함수형 프로그래밍이 적절하지 않을 수 있습니다.

 

2-5. 함수형  프로그래밍의 중요성

함수형 프로그래밍은 병렬 처리와 동시성에 강점을 지니고 있습니다. 예를 들어, 대용량 데이터를 다루는 상황에서 데이터 불변성을 유지함으로써 여러 스레드나 프로세스 간의 동기화 문제를 간소화할 수 있습니다. 또한, 불변성을 유지하면 특정 상태에 의존하지 않고 독립적인 함수를 작성하여 테스트와 디버깅이 편리해집니다.

 

뿐만 아니라 함수형 프로그래밍은 코드를 모듈화하고 추상화 수준을 높이는 데에도 용이합니다. 함수를 조합하여 새로운 함수를 만들거나 함수를 매개변수로 전달하는 등의 특성을 통해 코드의 재사용성을 높일 수 있습니다.

 

이러한 특징들은 코드를 간결하게 작성하고 유지보수하기 쉽게 만들어주며, 병렬 처리와 동시성을 쉽게 다룰 수 있는 이점을 제공합니다. 순수 함수와 불변성을 통해 예측 가능하고 안정적인 코드를 작성함으로써 프로그램의 신뢰성을 높이는 데 특히 프론트엔드 개발에서 사용자 인터페이스의 복잡성을 다룰 때 매우 유용합니다

 

3. 마무리

함수형 프로그래밍은 코드를 선언적이고 모듈화된 방식으로 작성하여, 불변성과 순수 함수를 강조하여 안정적이고 예측 가능한 코드를 만드는 데 주력합니다. 이로 인해 함수형 프로그래밍은 특정한 상태에 의존하지 않으며, 데이터의 불변성을 유지하므로서 코드의 안정성을 높입니다.

장점으로는 코드의 간결성, 모듈화를 통한 재사용성 증가, 병렬 처리 및 동시성에 강점이 있습니다. 하지만 동시에 학습 곡선이 다소 가팔라질 수 있고, 몇몇 상황에서는 성능 이슈가 발생할 수 있습니다. 따라서 함수형 프로그래밍을 적용할 때에는 문제의 복잡도와 프로젝트의 성격을 고려하여 사용해야 합니다.

함수형 프로그래밍을 활용함으로써 코드의 가독성을 향상시키고, 버그를 줄이며 유지보수성을 높일 수 있습니다. 주의할 점은 학습 곡선을 극복하고 실무에 적용하기 위해 충분한 연습과 이해가 필요하다는 점입니다.

 


참고 문헌

https://tech.wonderwall.kr/articles/functionaldependencymanagement/

 

함수형 프론트엔드에서 의존성 제어하기 : Wonderwall Tech

함수형 프론트엔드에서 의존성 제어하기 by taehee

tech.wonderwall.kr

https://www.infoworld.com/article/3613715/what-is-functional-programming-a-practical-guide.html

https://www.geeksforgeeks.org/functional-programming-paradigm/

https://medium.com/@Ariobarxan/what-is-a-programming-paradigm-ec6c5879952b

https://www.geeksforgeeks.org/introduction-of-programming-paradigms/

728x90