본문 바로가기

Java

함수형 인터페이스

메소드 : 매개변수의 값과 필드의 값에 따라 반환하는 값이 다를 수 있다.

함수 : 매개변수의 값이 일정하면 반환값도 일정하다.

 

public void draw() {
    Money money = Bank.login();

    if (money != null) {
        process(money);
    }
}

이 함수에서 draw() 외부의 login()이 반환하는 Bank의 상태는 함수의 입력이다.

그 값을 모른다면 draw() 함수가 어떻게 작동할지 알 수 없다.

Bank.login()이 반환하는 값에 따라 draw()가 내놓는 결과값(출력)은 다를 것이다.

 

이를 Side-effec(부작용, 부수작용)이라 한다.

“우리가 이 함수를 호출하려면 인수 목록에는 없지만 필요한 것들이 무엇이고, 반환 값에 반영되지 않으면서 하는 일은 무엇인가?”

 

 

이 부작용은 캡슐화와는 다르다.

캡슐화는 호출하는 쪽에서 구현부를 모르게 감추는 것을 말하지만,

부작용을 숨긴다는 것은 코드의 안과 외부 자체를 숨겨서 의존성이 없게 하는 것이다.(사실 뇌피셜임)

 

 

 

 

 

public void draw(Money bankStatus) {
    Money money = bankStatus;

    if (money != null) {
        process(money);
    }
}

위의 함수를 이렇게 바꿔 보았다.

언급했던 부작용을 매개변수로 뺐다.

이렇게 한다면 draw()라는 매개변수로 들어오는 Money가 일정하다면 반환하는 값도 일정하다.

'예측가능"이 되었다.

 

 

이렇게 모든 입력이 입력으로 선언되고, 모든 출력이 출력으로 선언 된 함수를 순수함수라고 한다.

 

함수형 프로그래밍은 이런 순수함수를 이용하여 모든 입출력이 숨겨진 것이 없이 예상가능하게 제어하여 입력과 출력의 관계를 기술하는 프로그래밍을 말한다.

 

 

 

 

 

 

함수형 프로그래밍에서는 다음과 같은 특징이 있다.

 

1급 객체

  • 변수나 collection 안에 담을 수 있어야 한다. -Java에서는 변수에 바로 메소드를 할당할 수 없다. 객체 안에 포장해야함
  • 파라미터로 전달할 수 있다.
  • 반환값으로 전달이 가능해야 한다.

고계함수

  • 함수의 파라미터로 함수를 전달할 수 있다.
  • 함수의 반환값으로 함수를 전달할 수 있다.

불변성

  • 함수형 프로그래밍에서는 데이터가 변할 수 없다.
  • 변경이 필요한 경우, 복사본을 만들어 변경하여 사용하여야 한다.

'Java' 카테고리의 다른 글

JAVA8) 람다 표현식  (0) 2020.12.11
JAVA8) 함수형 인터페이스  (0) 2020.12.11
static 메소드 사용  (0) 2020.12.09
equals() Overriding  (0) 2020.12.09
String과 StringBuilder  (0) 2020.12.06