SlideShare a Scribd company logo
함수형 프로그래밍(FP)
김민수
함수형 프로그래밍이 왜 뜨는가?
동시성처리에 강점이 있다?
코드가 간결해진다?
편한 기능들이 많다?
Moore's law
반도체 메모리칩의 성능 즉, 메모리의 용량이나 CPU의 속도가 18
개월에서 24개월마다 2배씩 향상된다는 '기술 개발 속도에 관한
법칙‘ - 위키백과
순수 함수(Pure Function)를 작성하는 것
-> 동일한 입력값에 대해서는 항상 동일한 출력값을 반환하는 것
함수형 프로그래밍이란?
순수 함수가 아닌 코드
public class OOP {
public static void main(String[] args) {
Point p = new Point();
final int value = 5;
p.setX(10);
p.addX(value); // 15
p.setX(15);
p.addX(value); // 20
}
}
@Data
class Point {
private int x;
private int y;
public int addX(int i){
return x + i;
}
}
함수형 스타일의 코드 (java.lang.Math)
public final class Math {
public static final double E = 2.718281828459045D;
public static final double PI = 3.141592653589793D;
private static long negativeZeroFloatBits = (long)Float.floatToRawIntBits(-0.0F);
private static long negativeZeroDoubleBits = Double.doubleToRawLongBits(-0.0D);
static double twoToTheDoubleScaleUp = powerOfTwoD(512);
static double twoToTheDoubleScaleDown = powerOfTwoD(-512);
private Math() {
}
public static double sin(double var0) {
return StrictMath.sin(var0);
}
public static double cos(double var0) {
return StrictMath.cos(var0);
}
public static double tan(double var0) {
return StrictMath.tan(var0);
}
객체지향 프로그래밍은 움직이는 부분을 캡슐화하여
코드이해를 돕고,
함수형 프로그래밍은 움직이는 부분을 최소화하여
코드이해를 돕는다.
마이클 페더스
순수함수로 작성되면 무엇이 좋은가?
1. 부작용(Side effect)이 없다.
2. Thread-safe 하다.
3. 테스트하기 편리하다.
람다(lambda)
함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수
(Anonymous Functions)를 지칭하는 용어이다. – 나무위키
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface
<code>Runnable</code> is used
* to create a thread, starting the thread causes the
object's
* <code>run</code> method to be called in that separately
executing
* thread.
* <p>
* The general contract of the method <code>run</code> is
that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
new Thread(() -> {
System.out.println("람다식");
});
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("익명 클래스");
}
});
new Thread(new Runnable() {
private Object status;
@Override
public void run() {
System.out.println ("상태가 있는 익명
클래스");
}
});
Runnable 람다 예제
고계함수(Higher-Order Function)
함수의 파라미터로 함수를 받을 수 있다.
결과값으로 함수를 리턴한다.
함수형 프로그래밍은
선언형 프로그래밍이다?
프로그램이 “어떤 방법”으로 해야 하는지를 나타내기보다 “무엇”
과 같은지를 설명하는 경우에 "선언형"이라고 한다. - 위키백과
명령형 - 어떻게?
선언형 - 무엇을?
선언형 프로그래밍이란?
명령형 프로그래밍
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Imperative {
public static void main(String[] args) {
List<Integer> numbers = IntStream.range(0, 20).boxed().collect(Collectors.toList());
List<Integer> newNumbers = new ArrayList<>();
for (int num : numbers){
if(num < 10){
newNumbers.add(num * 2);
}
}
// newNumbers : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
}
}
선언형 프로그래밍
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Declarative {
public static void main(String[] args) {
List<Integer> numbers = IntStream.range(0, 20).boxed().collect(Collectors.toList());
numbers.stream()
.filter(n -> n < 10)
.map(n -> n * 2)
.collect(Collectors.toList()); // [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
}
}
꼬리 재귀 최적화(Tail Recursion)
재귀의 스택을 무한정 쌓는 문제를 해결할 수 있다.
컴파일 과정중에 꼬리재귀를 루프형태(언어마다 다르지만 goto
를 통한)로 바꾼다.
메모이제이션(Memoization)
컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산
한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거
하여 프로그램 실행 속도를 빠르게 하는 기술이다. – 위키백과
-> Cache
패러다임의 변화
정리해보자!
함수형 프로그래밍의 장점
1. 부작용(Side effect)이 없다.
2. Thread-safe 하다.
3. 테스트하기 편리하다.
4. 로직에만 집중할 수 있다.
함수형 프로그래밍의 단점
1. 상태가 없다.
2. 어렵다.
3. 인력이 부족하다.
그래서 어떻게 하라고?
멀티 패러다임 프로그래밍
상태가 필요한 곳에서는 OOP를 사용하고,
상태가 없어도 되거나, 동시성 문제가 중요하면 FP를 사용하자!
더 알아볼 것
• 함수형 프로그래밍과 디자인 패턴
• 커링, 부분함수 (합성함수)
감사합니다.

More Related Content

What's hot

C++’s move semantics
C++’s move semanticsC++’s move semantics
C++’s move semantics
Lusain Kim
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
욱진 양
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
흥배 최
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
SeungHyun Eom
 
Jvm
JvmJvm
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
Changwon National University
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Young-Beom Rhee
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Young-Beom Rhee
 
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
Sang Don Kim
 
JavaInAction 자바 8
JavaInAction 자바 8JavaInAction 자바 8
JavaInAction 자바 8
NBT Inc.
 
PPL: Composing Tasks
PPL: Composing TasksPPL: Composing Tasks
PPL: Composing Tasks
용준 김
 
Clean code
Clean codeClean code
Clean codebbongcsu
 
Protocol 잘 쓰기 (let us: Go! Summer 2017)
Protocol 잘 쓰기 (let us: Go! Summer 2017)Protocol 잘 쓰기 (let us: Go! Summer 2017)
Protocol 잘 쓰기 (let us: Go! Summer 2017)
Mike JS Choi
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선daewon jeong
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
Young-Beom Rhee
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
효준 강
 
자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
HeeChang Lee
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
Kth개발자 세미나 1회
Kth개발자 세미나 1회Kth개발자 세미나 1회
Kth개발자 세미나 1회
Byeongsu Kang
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function
Young-Beom Rhee
 

What's hot (20)

C++’s move semantics
C++’s move semanticsC++’s move semantics
C++’s move semantics
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
Jvm
JvmJvm
Jvm
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
 
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
 
JavaInAction 자바 8
JavaInAction 자바 8JavaInAction 자바 8
JavaInAction 자바 8
 
PPL: Composing Tasks
PPL: Composing TasksPPL: Composing Tasks
PPL: Composing Tasks
 
Clean code
Clean codeClean code
Clean code
 
Protocol 잘 쓰기 (let us: Go! Summer 2017)
Protocol 잘 쓰기 (let us: Go! Summer 2017)Protocol 잘 쓰기 (let us: Go! Summer 2017)
Protocol 잘 쓰기 (let us: Go! Summer 2017)
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
 
자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
Kth개발자 세미나 1회
Kth개발자 세미나 1회Kth개발자 세미나 1회
Kth개발자 세미나 1회
 
프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function프론트엔드스터디 E04 js function
프론트엔드스터디 E04 js function
 

Similar to 함수형 프로그래밍

Java8 람다
Java8 람다Java8 람다
Java8 람다
Jong Woo Rhee
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2
도현 김
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
은숙 이
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
jongho jeong
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
준혁 이
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
HyeonSeok Choi
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
lactrious
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
Astin Choi
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
WooYoung Cho
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
JiandSon
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
Chiwon Song
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
Sungik Kim
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
MIN SEOK KOO
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장SeongHyun Ahn
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
Javajigi Jaesung
 
파이썬 데이터베이스 연결 2탄
파이썬 데이터베이스 연결 2탄파이썬 데이터베이스 연결 2탄
파이썬 데이터베이스 연결 2탄
SeongHyun Ahn
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
Insuk (Chris) Cho
 

Similar to 함수형 프로그래밍 (20)

Java8 람다
Java8 람다Java8 람다
Java8 람다
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
강의자료 2
강의자료 2강의자료 2
강의자료 2
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
 
파이썬 데이터베이스 연결 2탄
파이썬 데이터베이스 연결 2탄파이썬 데이터베이스 연결 2탄
파이썬 데이터베이스 연결 2탄
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
 

함수형 프로그래밍

  • 2. 함수형 프로그래밍이 왜 뜨는가? 동시성처리에 강점이 있다? 코드가 간결해진다? 편한 기능들이 많다?
  • 3. Moore's law 반도체 메모리칩의 성능 즉, 메모리의 용량이나 CPU의 속도가 18 개월에서 24개월마다 2배씩 향상된다는 '기술 개발 속도에 관한 법칙‘ - 위키백과
  • 4. 순수 함수(Pure Function)를 작성하는 것 -> 동일한 입력값에 대해서는 항상 동일한 출력값을 반환하는 것 함수형 프로그래밍이란?
  • 5. 순수 함수가 아닌 코드 public class OOP { public static void main(String[] args) { Point p = new Point(); final int value = 5; p.setX(10); p.addX(value); // 15 p.setX(15); p.addX(value); // 20 } } @Data class Point { private int x; private int y; public int addX(int i){ return x + i; } }
  • 6. 함수형 스타일의 코드 (java.lang.Math) public final class Math { public static final double E = 2.718281828459045D; public static final double PI = 3.141592653589793D; private static long negativeZeroFloatBits = (long)Float.floatToRawIntBits(-0.0F); private static long negativeZeroDoubleBits = Double.doubleToRawLongBits(-0.0D); static double twoToTheDoubleScaleUp = powerOfTwoD(512); static double twoToTheDoubleScaleDown = powerOfTwoD(-512); private Math() { } public static double sin(double var0) { return StrictMath.sin(var0); } public static double cos(double var0) { return StrictMath.cos(var0); } public static double tan(double var0) { return StrictMath.tan(var0); }
  • 7. 객체지향 프로그래밍은 움직이는 부분을 캡슐화하여 코드이해를 돕고, 함수형 프로그래밍은 움직이는 부분을 최소화하여 코드이해를 돕는다. 마이클 페더스
  • 8. 순수함수로 작성되면 무엇이 좋은가? 1. 부작용(Side effect)이 없다. 2. Thread-safe 하다. 3. 테스트하기 편리하다.
  • 9. 람다(lambda) 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수 (Anonymous Functions)를 지칭하는 용어이다. – 나무위키
  • 10. @FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); } new Thread(() -> { System.out.println("람다식"); }); new Thread(new Runnable() { @Override public void run() { System.out.println("익명 클래스"); } }); new Thread(new Runnable() { private Object status; @Override public void run() { System.out.println ("상태가 있는 익명 클래스"); } }); Runnable 람다 예제
  • 11. 고계함수(Higher-Order Function) 함수의 파라미터로 함수를 받을 수 있다. 결과값으로 함수를 리턴한다.
  • 13. 프로그램이 “어떤 방법”으로 해야 하는지를 나타내기보다 “무엇” 과 같은지를 설명하는 경우에 "선언형"이라고 한다. - 위키백과 명령형 - 어떻게? 선언형 - 무엇을? 선언형 프로그래밍이란?
  • 14. 명령형 프로그래밍 import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class Imperative { public static void main(String[] args) { List<Integer> numbers = IntStream.range(0, 20).boxed().collect(Collectors.toList()); List<Integer> newNumbers = new ArrayList<>(); for (int num : numbers){ if(num < 10){ newNumbers.add(num * 2); } } // newNumbers : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] } }
  • 15. 선언형 프로그래밍 import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class Declarative { public static void main(String[] args) { List<Integer> numbers = IntStream.range(0, 20).boxed().collect(Collectors.toList()); numbers.stream() .filter(n -> n < 10) .map(n -> n * 2) .collect(Collectors.toList()); // [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] } }
  • 16. 꼬리 재귀 최적화(Tail Recursion) 재귀의 스택을 무한정 쌓는 문제를 해결할 수 있다. 컴파일 과정중에 꼬리재귀를 루프형태(언어마다 다르지만 goto 를 통한)로 바꾼다.
  • 17. 메모이제이션(Memoization) 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산 한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거 하여 프로그램 실행 속도를 빠르게 하는 기술이다. – 위키백과 -> Cache
  • 20. 함수형 프로그래밍의 장점 1. 부작용(Side effect)이 없다. 2. Thread-safe 하다. 3. 테스트하기 편리하다. 4. 로직에만 집중할 수 있다.
  • 21. 함수형 프로그래밍의 단점 1. 상태가 없다. 2. 어렵다. 3. 인력이 부족하다.
  • 23. 멀티 패러다임 프로그래밍 상태가 필요한 곳에서는 OOP를 사용하고, 상태가 없어도 되거나, 동시성 문제가 중요하면 FP를 사용하자!
  • 24. 더 알아볼 것 • 함수형 프로그래밍과 디자인 패턴 • 커링, 부분함수 (합성함수)

Editor's Notes

  1. 레거시 코드 활용 전략의 저자
  2. 메소드 체이닝 기법을 많이 쓰는 이유 설명 객체와 상태에 의존해서 로직이 수행되는게 아니라 기본 자료구조들에서부터 시작함
  3. 고계 함수란, 함수를 다루는 함수를 뜻한다. 사실 함수형 언어에서는 함수도 '값(value)'으로 취급한다.
  4. 또 한번 상태를 가질 수 없는 함수형의 특징이 나온다. 함수형에서 람다는 객체나 함수가 아니라 단순히 값이다.
  5. 함수형 프로그래밍 언어는 어떤 연산도 정해진 순서로 계산되어야 한다는 것이 정의되지 않고 함수들의 입력과 출력이 서로 연결되어 있기 때문에 선언형이다. 프로그램을 좀 더 빠르게 만들 수 있기 때문에(이미 다 만들어 진것만 선언을 통해 쓰기 때문에) 컴퓨터가 연산되는 구체적인 작동 순서를 나열하지 않고, 알고리즘에만 집중 할 수 있다.
  6. 명령형 프로그램은 알고리즘을 명시하고 목표는 명시하지 않는 데 반해 선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것이다.
  7. 언어 자체에서 제공하는 캐시 기능이기 때문에 최적화된 성능으로 코드를 거의 바꾸지 않고 캐시 혜택을 누릴 수 있다.
  8. “양도” 절차지향 -> 객체지향 가비지 컬렉션