메소드 : 매개변수의 값과 필드의 값에 따라 반환하는 값이 다를 수 있다.
함수 : 매개변수의 값이 일정하면 반환값도 일정하다.
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 |