본문 바로가기
JAVA

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

by 집도리잡동사니 2023. 5. 21.
반응형

안뇽하세요! 이번 포스팅에서는 함수형 프로그래밍에 대해 알아보고, 그 특징과 장점을 다루어보겠습니다.

함수형 프로그래밍은 현대 소프트웨어 개발에서 더욱 중요해지고 있는 패러다임 중 하나로, 코드의 간결성유연성을 향상시키며 버그를 줄이고 생산성을 높일 수 있습니다.

 

제가 오늘 포스팅 주제를 함수형 프로그래밍으로 정한 이유는 알고리즘을 계속 하다보니, 람다식 표현을 많이 사용하게되는데, 람다식 표현을 설명하기 전에 함수형 프로그래밍이 무엇인지 알아야, 람다식 표현에 대해 조금더 이해하기가 쉽기 때문에 먼저 포스팅 하게되었습니다.

1. 함수형 프로그램밍의 등장 배경

  • 수학적 기초 : 함수형 프로그래밍은 수학적 개념과 원리에 기반을 두고 있습니다. 람다 대수, 명제 논리, 집합 이론 등의 수학적 개념이 함수형 프로그래밍에 영향을 미쳤습니다. 이러한 기초를 바탕으로 함수형 프로그래밍은 더 간결하고 정확한 코드 작성을 목표로 합니다.
  • 상태와 부작용의 제어 : 전통적인 명령형 프로그래밍에서는 상태 변경과 부작용이 주요한 개념이었습니다. 하지만 이로 인해 코드의 복잡성과 버그의 발생 가능성이 증가하며, 병렬 처리와 테스트 등의 과정에서 어려움을 겪을 수 있습니다. 함수형 프로그래밍은 불변성과 부작용 최소화를 통해 코드의 안정성을 높이고, 병렬 처리와 테스트에 용이한 환경을 제공합니다.
  • 병렬 처리의 필요성 : 현대 소프트웨어 개발에서는 대용량 데이터 처리, 동시성 작업, 분산 시스템 등 병렬 처리가 중요한 요소가 되었습니다. 함수형 프로그래밍은 불변성과 순수 함수 개념을 통해 상태를 공유하지 않고 병렬 실행이 가능하도록 설계되어 있습니다.
  • 소프트웨어 유지보수의 어려움 : 전통적인 명령형 프로그래밍에서는 전역 변수의 남발과 상태 변경의 어려움으로 인해 코드의 유지보수가 어려운 경우가 많습니다. 함수형 프로그래밍은 불변성과 모듈화를 통해 코드의 재사용성과 유지보수성을 향상시킵니다.
  • 다양한 환경과 플랫폼의 발전 : 함수형 프로그래밍은 다양한 환경과 플랫폼에서 적용할 수 있는 유연한 프로그래밍 스타일입니다. 병렬 처리, 분산 시스템, 이벤트 기반 프로그래밍 등 다양한 도메인과 관련된 문제를 해결하기 위해 함수형 프로그래밍이 적합한 경우가 많습니다.

2. 함수형 프로그래밍의 개념과 특징

  • 함수형 프로그래밍의 핵심 개념 : 함수를 일급 객체로 취급하여 함수의 조합과 추상화에 초점을 맞춥니다.
  • 상태 변경 대신 함수의 평가 : 상태 변경 보다는 입력과 출력 사이의 변환을 강조하며, 부작용을 최소화 하여 코드의 안정성을 높입니다.
  • 불변성과 데이터 불변성 : 변경 불가능한 데이터와 불변성을 유지하여 병렬 처리와 다중 스레드 환경에서 안정적인 코드를 작성할 수 있습니다.

3. 함수형 프로그래밍 예제

기존에 프로그래밍 언어에서는 i라는 변수에 값을 할당한 후 사용하였다.

// 1 ~ 10 까지 출력
for(int i=1; i<11; i++) {
	System.out.println(i);
}

함수형 프로그래밍 예제

iteratorPrintFunc(10, print(num));

(위의 코드는 실제 동작과는 별개로 이해를 돕기위해 작성한 코드이다.)

함수형 프로그래밍은 대입문을 사용하지 않는 프로그래밍이며, 코드의 간결성과 정확성을 높이는 프로그래밍 언어입니다.

iteratorPrintFunc함수는 첫번째 인자로 몇번을 반복할것인지 정하고, 두번째 인자로 출력하라는 함수를 전달 받았다.

해당 iteratorPrintFunc 함수는 10번 print(num)을 실행한다.

 

명령형 프로그래밍에서는 메소드를 호출하면 상황에 따라 내부의 값이 바뀔 수 있다. 즉, 우리가 개발한 함수 내에서 선언된 변수의 메모리에 할당된 값이 바뀌는 등의 변화가 발생할 수 있다. 하지만 함수형 프로그래밍에서는 대입문이 없기 때문에 메모리에 한 번 할당된 값은 새로운 값으로 변할 수 없다.

이것이 2번에서 특징으로 설명한 불변성과 데이터 불변성이다.

 

4. Java를 이용한 함수형 프로그래밍 예시

조건은 아래의 4가지 사항이다.

1. 단어의 크기가 2 이상인 경우를 필터링한다.

2. 모든 단어를 대문자로 변환한다.

3. 모든 단어를 앞글자만 잘라내어 변환한다.

4. 모든 단어를 스페이스로 구분한 하나의 문자열로 합친다.

 

객체지향 프로그래밍의 관점에서 봤을때 해당 기능들을 각각의 함수로 만들경우 코드 길이는 상당히 길어지고 가독성 또한 떨어질 것이다. 하지만 함수형 프로그래밍으로 구현한 코드의 길이는 상당히 짧으며, 가독성 또한 좋다.

public class WordProcessTest {

    private final List<String> words = Arrays.asList("TONY", "a", "hULK", "B", "america", "X", "nebula", "Korea");

    @Test
    void wordProcessTest() {
        String result = words.stream()
                .filter(w -> w.length() > 1)
                .map(String::toUpperCase)
                .map(w -> w.substring(0, 1))
                .collect(Collectors.joining(" "));

        assertThat(result).isEqualTo("T H A N K");
    }
}

처음에 Stream API를 접하게 되면 오히려 어렵게 느낄수 있으며, 위의 코드를 전혀 알아들을수 없을 수 도있다. 필자인 저도, 알고리즘 공부를 하며, 다른 사람들은 어떻게 풀었나 볼때 람다식 표현을 사용한 코드를 보았을때 이해가 되지 않았으며, 그래서 공부를 하고, 포스팅을 하게되었습니다. 하지만 함수형 프로그래밍 또한 새로운 프로그래밍 패러다임인 만큼 학습과 적응이 필요하다.

 

1. filter 파라미터로 넘어간 함수 : 주어진 문자열의 길이가 1인지를 판별해서 걸러낸다.

2. 첫번째 map을 통해 String 클래스를 통해 words에 들어 가있는 문자열을 대문자로 변환한다.

3. 두번째 map을 통해 w로 주어진 문자열들을 첫번째 단어만 잘라낸다.

4. collect를 통해 주어진 문자열을 스페이스 간격을 이어붙인다.

 


참고자료

이번 포스팅을 하게된 계기는, 원래는 알고리즘을 공부하다가, 람다식 표현을 자주 쓰는것을 보고, 공부하면서 람다식에 대해서 한번 포스팅 해야겠다고, 생각하였다가 람다식에 대해 포스팅 하던중 함수형 프로그래밍을 먼저 설명하고 이해해야지 람다식을 이해하는데 조금더 수월하다고 생각되어 포스팅 하게되었습니다.

 

긴글 읽어주셔서 감사하고 틀린 부분 있으면 댓글로 알려주시면 수정하겠습니다. 공부하는 개발자

728x90
반응형

'JAVA' 카테고리의 다른 글

Web 채팅 프로그램 만들기  (1) 2023.06.19
JAVA 메모리 영역  (0) 2023.03.21
[JAVA] - try(){}, Try-with-resources 란?  (1) 2022.11.07

댓글