함수형 프로그래밍 (Functional-style programming)

부수 효과를 없애고 순수 함수를 만들어 모듈화 수준을 높이는 프로그래밍 패러다임

: 부수효과란  주어진 값 이외의 외부 변수 및 프로그램 실행에 영향을 끼치지 않아야 된다는 의미이며, 부수효과를 만족하는 함수를 순수함수라고 한다.


- 순수함수 : 모든 입력이 입력으로만, 모든 출력이 출력으로만 사용
- 비순수함수: 숨겨진 입력이나 출력이 존재


즉 함수형 프로그래밍은 순수함수를 지향, 최대한 숨겨진 입력과 출력을 제거하여 가능한  코드를 입력과 출력의 관계로 사용해야 한다.


객체지향 프로그래밍과 함수형 프로그래밍

1) 객체 지향은 명령형 프로그래밍이고, 함수형 프로그래밍은 선언형 프로그래밍이다.


: 우선 명령형 프로그래밍과 함수형프로그래밍의 차이의 핵심은 문제해결의 관점이다. 기존의 우리가 객체지향 프로그래밍을 할 때는 데이터를 어떻게 처리할 지에 대해 명령을 통해 풀어 나아갔다면, 함수형 프로그래밍은 선언적 함수를 통해 무엇을 풀어나아갈지 결정하는 것이다.


아직 Stream API에 대해 다뤄보진 않았지만, 간단히 샘플 코드를 통해 비교해본다면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
        List<String> myList =
                Arrays.asList("c1""a2""b3""4""5");
 
        // 기존방식
        for(int i=0; i<myList.size(); i++){
            String s = myList.get(i);
            if(s.startsWith("c")){
                System.out.println(s.toUpperCase());
            }
        }
 
        // stream API를 이용한 방식
        myList.stream()
              .filter(s -> s.startsWith("c"))
              .map(String::toUpperCase)
              .forEach(System.out::println);
 
 
cs


처음보면 크게 와 닿지 않을 수 있지만, 기존 방식과는 많이 다르다. 중요한 점은 프로그래밍 패러다임의 변화이다. 단순하게 함수를 선언함으로써 데이터들을 내가 원하는 방향으로 처리해 나아가고 있다는 점이다. 한눈에 보더라도 함수형프로그래밍을 통해 구현한 아래코드가 무엇을 하고있는지에 대해 명확하다.


2) 함수형 프로그래밍에서 함수는 1급객체 여야 한다.

위키피디아의 정의된 1급객체의 의미를 인용하면..

특정 언어의 일급 객체 (first-class citizens, 일급 값, 일급 엔티티, 혹은 일급 시민)이라 함은 컴퓨터 프로그래밍 언어 디자인에서 일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.


1급 객체(First class object)란 다음과 같은 조건을 만족하는 객체이다.

  • 변수나 데이터 구조안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값(return value)으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.
  • 기존 데이터의 불변성(Immutable)


자바에서 그동안 함수는 메소드를 값으로 표현할 수 없어 1급 시민이 아닌 2급 시민으로써 역할 해왔다. 하지만 자바8에서 함수는 1급시민이 되어 함수형 프로그래밍의 핵심이 되었다.


사실 위의 2가지 특징이 함수형 프로그래밍의 모든 것을 나타낸다고 생각하는데, 위의 특징이 단점이 될 수도 있다. 예를 들면, 덕분에 코드의 간결성이 증가되었지만 그만큼 학습의 필요로 한다. 함수형 프로그래밍을 학습하는 것은 결코 쉽지 않기 때문에 오랜 학습이 필요하다.



Java 8만의 3가지 기술

- 인터페이스의 디폴트 메소드

- 메소드 레퍼런스, 람다

- Stream API




참조

- https://velog.io/@kyusung/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9A%94%EC%95%BD#%EB%AA%85%EB%A0%B9%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EA%B3%BC%EC%9D%98-%EB%B9%84%EA%B5%90

- Java8 in action

+ Recent posts