김동형수 개발기

Grokking Functional Programming - 1부 1장 본문

책 스터디/[완료] FP - Grokking Funtional Programming

Grokking Functional Programming - 1부 1장

김동형수 2022. 11. 9. 23:14

1장 Learning Functional Programming

이 장에서 배우게 될

  • 누구를 위한 책인가
  • 기능이란 무엇입니까
  • 함수형 프로그래밍이 얼마나 유용한지
  • 필요한 도구를 설치하는 방법
  • 이 책을 사용하는 방법

1.1 아마도 당신이 이 책을 집어든 이유는...

함수형 프로그래밍이 궁금하거나, 이전에 배우려고 했거나, 수년간 객체지향 또는 명령형 언어로 하다가 함수형의 맛을 잠깐 본 경우, 아니면 실습위주의 학습을 통한 성장

 

1.2 시작하기 전에 알아야 할 사항은 무엇입니까?

 
널리 사용되는 언어(아래의 예제는 java)로 이전에 개발을 했을 때 클래스 및 객체와 같은 기본 객체 지향 개념에 익숙한 경우 편안하게 따라할 수 있다.
 

소프트웨어 모듈의 안정성, 테스트 가능성, 회귀 또는 통합에 문제가 있는 경우 최대 혜택을 받을 수 있다.

객체지향 전문가가 될 필요가 없고 널리 알려진 언어를 마스터할 필요가 없고 함수형 언어에 대해서 무엇이든 알고 있어야할 필요가 없다.

 

1.3 함수는 어떻게 생겼습니까?

아래의 코드를 보면 함수는 모두 공통점이 있다.

public static int add(int a, int b) {
  return a + b;
}

public static char getFirstCharacter(String s) {
  return s.charAt(0);
}

public static int divide(int a, int b) {
  return a / b;
}

public static void eatSoup(Soup soup) {
  // TODO: "eating the soup" algorithm
}
 

그것은 바로 일부 값을 입력으로 받고, 무언가를 하고, 출력으로 값을 반환할 수 있다.

 

모든 함수는 public static을 가지고 있다. 그 이유는 인스턴스 할당을 하지 않아도 호출을 할 수 있기 때문에 비용을 절감할 수 있다.

지금의 함수는 언제 어디서든 public하게 호출할 수 있다고 약속.

 

public static int increment(int x) {
  // TODO
  return x + 1;
}
public static String concatenate(String a, String b) {
  // TODO
  return a + b;
}

1.4 함수를 만나다

기본적으로 함수는 선언부와 본문으로 구성된다.
이 책에서는 값을 반환하는 함수에 초점을 맞추게 된다. 반환이 없는(void) 인 함수는 나오지 않을 예정이다.

함수를 입력값을 가져오고 무언가를 하고 출력하는 상자로 취급할 것이다.
입력 및 출력값의 이름과 유형은 선언부 일부이다.

선언부 만으로 함수에서 일어나는 일을 유추할 수 있다면 코드를 읽는 프로그래머들에게 큰 도움이 된다.
FP에서 함수의 본체보다 선언부에 더 집중하는 경향이 있다.
 
public static int increment(int x)
// 함수의 선언부를 보면 x에 값을 증가시키는 본체를 갖고 있을거라 유추가 된다.
 

1.5 코드가 거짓말을 할 때...

add 함수를 제외한 나머지 함수들은 입력값에 따라서 원치 않는 결과를 야기할 수 있다.

이 책에서는 거짓말 하지 않는 함수를 작성하는 방법에 대해서 배우게 된다. FP에서 큰 의미를 갖는다.

 

1.6 명령적 vs 선언적

명령적 프로그래밍은 계산하는데 중점을 두고 선언적 프로그래밍은 수행방법보단 수행해야하는 작업에 중점을 둔다.
일반적으로 선언적 방식이 명령적 방식보다 코드가 더 이해하기 쉽다. 이 책에서는 선언적 접근 방식을 이용해서 실제 프로그램을 작성하는 방법을 배운다.
 

1.7 휴식 시간: 명령적 vs 선언적

calculateScore("imperative") == 9 wordScore("declarative") == 9
calculateScore("no") == 2 wordScore("yes") == 3
// Make sure to think about the solution for a bit before checking the next page. The best way to do this is to write your answer on a piece of paper or using a computer.

 

public static int calculateScore(String word) {
  int score = 0;
  for(char c : word.toCharArray()) {
   score++;
   //문제에서 제시하는 최대값이 9이므로 if문 조건을 통해서 반복문을 탈출한다. 명령적 접근 방법을 이용한다.
   if(score == 9) break;
 }
 return score;
}

 public static int wordScore(String word) {
  //최대값을 구하는 Math.max를 이용해서 선언적 접근 방법을 이용한다.
  return Math.max(word.length(), 9);
 }
 

1.8 커피 브레이크 설명: 명령적 vs 선언적

문제의 해설을 보니 'a'가 아닌 문자열을 카운팅 한다고한다. 내 풀이도 맞는 것 같은데..

FP에서 우리는 "어떻게" 발생해야 하는지보다 "무엇"이 더 자주 발생해야 하는지에 중점을 둡니다.

1.9 함수형 프로그래밍을 배우는 것이 얼마나 유용합니까?

함수형 프로그래밍은 다음과 같은 함수를 사용하여 프로그래밍하는 것이다.

  • 거짓말을 하지 않는 함수 선언부
  • 가능한 한 선언적인 본문

 

선언적 및 함수형 프로그래밍이 전통적인 언어로 확장

FP언어에서도 기본 개념은 동일

문제를 해결하는데 다양한 사고(기존 방식 사고 + 함수적 및 선언적 사고)

 

1.10 스칼라로의 도약

러닝커브를 줄이기 위해서 기존언어(java)와 유사한 함수형 언어인 스칼라를 선택

 

1.11 스칼라에서 함수 연습하기

public static int increment(int x) {
 return x + 1;
}

public static char getFirstCharacter(String s) {
 return s.charAt(0);
}

public static int wordScore(String word) {
 return word.length();
}
 
def increment(x: Int): Int = x + 1

def getFirstCharacter(s: String): Char = s.charAt(0)

def wordScore(word: String): Int = word.length

 

 

실습...

 

1.16 요약

함수란 무엇인가? 에 대한 이해
명령형 프로그래밍, 선언적 프로그래밍 언급
도구설치 ( scala, sbt, jdk )
Comments