함수형 프로그래밍에 대한 내용을 Java 카테고리에 다루고 있어서 좀 의아해 하시는 분들이 계실 수 있을 거 같습니다. Java 8에 등장한 Lambda와 Stream을 통해 Java도 FP(Functional Programming)가 가능해졌습니다. Java라는 언어가 계속 버전업이 되고 발전하고 있지만 Java 8이 가장 핵심적인 버전업이지 않을까 생각됩니다.
요즘 Java/Spring으로 된 레거시 프로젝트를 Kotlin/Spring으로 전환하거나, 새로운 프로젝트는 처음부터 Kotlin/Spring으로 시작하는 기업이 많아지고 있습니다. Kotlin에서 제공하는 다양한 기능과 이점이 있겠지만 그 근본에는 Kotlin이 함수형 프로그래밍이 가능한 언어라서 그런게 아닐까 싶습니다.
제가 꽤나 좋아하는 문구를 인용하자면,
이 세상에서 변하지 않는 유일한 것은 모든 것이 끊임없이 변하고 있다는 사실뿐입니다. 그리고 변화에 맞서 대응하지 않으면 쇠퇴할 것입니다.
특히나 IT 업계는 다른 업계보다 빠르게 변한다고 생각합니다. 그렇기에 끊임없이 공부하는 것이 개발자의 숙명이라 생각합니다. 그래서 Java 8에 생긴 Lambda와 Stream을 통해 함수형 프로그래밍을 연습하고 Kotlin은 추후에 도전해볼 생각입니다.
그럼 모든 기술이나 배움에 있어서 의문과 질문은 중요하기 때문에 "왜 함수형 프로그래밍을 배워야 하는가?"이란 질문에 대한 재성님의 강의 내용을 정리해보도록 하겠습니다.
1. 동시성 이슈
스마트폰까지 멀티 CPU를 가지고 있는 상황에서 동시성 이슈를 해결하면서 안정적인 소프트웨어를 개발하는 것에 대한 중요성이 높아졌다.
데이터의 상태를 변경하는 객체 지향 프로그래밍 방식으로 동시성 문제를 해결하는 데는 한계가 있다.
2. 데이터 관리에 따른 부담
대용량 데이터를 다루는 작업이 점점 더 많아지고 있다. 대용량 데이터를 처리할 때 데이터를 객체로 변환하는데 따른 부담이 크다.
대용량 데이터를 처리할 수 있는 효율적인 데이터 구조와 데이터 연산이 필요하다.
3. 함수형 프로그래밍은 모듈화되어 있다.
객체 단위의 모듈화는 가장 작은 단위의 모듈화가 아니다. 함수형 프로그래밍의 함수를 모듈화할 경우 수 많은 곳에 재사용할 수 있다.
함수형 프로그래밍은 더 유용하고, 재사용이 편리하고, 구성(compose)이 용이하고, 테스트하기 더 간편한 추상화를 제공한다.
4. 더 빠르게 작업해야 한다.
소프트웨어 개발 흐름은 점점 더 빠른 결과물을 확인할 수 있기를 기대하는 방향으로 변화되고 있다.
객체에 대한 모델링에 많은 시간을 투자하기보다 사용자 요구사항에 대해서 최소한으로 충분한 수준을 유지하면서 동시에 변화에 대해서도 유연하게 대응하는데 도움을 준다.
5. 함수형 프로그래밍은 단순함으로의 복귀다.
요구사항 자체가 본질적으로 가지고 있는 복잡성이 아니라 요구사항을 구현하기 위해 선택된 방식에서의 복잡성을 단순화할 수 있을 것으로 기대한다.
함수형 프로그래밍을 학습하면 문제에 접근하는 방법, 문제를 작은 단위로 쪼개는 방법, 설계하는 과정, 프로그래밍하는 순서에서 새로운 시각을 배울 수 있다.
함수형 프로그래밍의 특징
- 변경 불가능한 값(immutable value)을 활용
=> 값이 변경되는 것을 허용하면 멀티 스레드 프로그래밍이 힘들다.
=> 값을 변경할 수 없는 경우 프로그램의 정확성을 높여 버그의 발생 가능성을 줄인다.
- 1등 시민으로서의 함수
=> 함수형 프로그래밍에서는 함수가 1등 시민의 역할을 한다.
=> 함수를 1등 시민으로 활용이 가능할 경우 함수를 함수의 인자로 받거나, 함수의 반환 값으로 활용하는 것이 가능하다.
- 람다와 클로저
=> 람다는 익명 함수의 다른 표현이다. 즉, 함수는 함수인데 이름이 없는 경우를 의미한다.
- 고계함수(higher-order functions) / 고차함수
=> 고계함수란 다른 함수를 인수로 받아들이거나 함수를 리턴하는 함수이다. 자바 메소드는 인수나 반환 값으로 primitive type과 객체만 사용할 수 있다. 함수형 프로그래밍은 함수가 1등 시민이 될 수 있기 때문에 고계함수가 가능하다.
함수형 프로그램의 가장 핵심적인 특징은 side effect를 만들지 않는 것이다.
'Java' 카테고리의 다른 글
[Java] List, ArrayList, LinkedList (0) | 2022.04.21 |
---|