backend

[책] 함수형 사고 - Chapter 2. 전환

버리야 2018. 7. 22. 15:50
반응형

책 함수형 사고(Functional Thinking)을 읽고, 관련 예제를 살펴보며 간단 정리한 것입니다.

책 예제와는 조금 다를 수도 있습니다.


참고) 영문 책의 예제

https://github.com/oreillymedia/functional_thinking




Chapter 2. 전환


명령형 처리

명령형 프로그래밍이란 상태를 변형하는 일련의 명령들로 구성된 프로그래밍 방식.

전형적인 for 루프가 명령형 프로그래밍의 훌륭한 예. 초기 상태를 설정하고 되풀이할때마다 일련의 명령을 실행한다.


명령형 프로그래밍은 개발자로 하여금 루프 내에서 연산하기를 권장한다. 

책에 나와 있는 예제에서는 세가지를 실행했다.

한 글자짜리 이름을 필터했고, 목록에 남아있는 이름들을 대문자로 변형하고, 이 목록을 하나의 문자열로 변환했다.

우선 이 세가지 작업을 목록에 적용할 '유용한 작업들'이라고 정의하자. 

명령형 언어에서는 세 가지 작업에 모두 저수준의 매커니즘을(목록 내에서 반복해서) 사용해야 한다.

함수형 언어들은 이런 작업을 위한 몇몇 도우미(helper)들을 제공한다.



함수형 처리

함수형 프로그래밍은 프로그램을 수학 공식을 모델링하는 표현과 변형으로 기술하며, 가변 상태를 지양한다.

개발자는 고계함수에 매개변수로 주어지는 함수를 이용하여 저수준의 작업을 커스터마이즈할 수 있다.


의사코드를 사용하여 개념화해보자.

listOfEmps

-> filter(x.length > 1)

-> transform(x.capitalize)

-> convert(x + "," + y)

 

/**
 * Chapter 2. 전환
 * 예제 : 어떤 이름 목록에서, 한 글자로 된 이름을 제외한 모든 이름의 첫글자를 대문자화해서 쉼표로 연결한 문자열을 구하자.
 */
public class TheCompanyProcess {

	//for문을 이용한 명령형 처리
	public String cleanNames(List listOfNames) {
		StringBuilder result = new StringBuilder();
		for (int i = 0; i < listOfNames.size(); i++) {
			if (listOfNames.get(i).length() > 1) {
				result.append(capitalizeFirstLetter(listOfNames.get(i))).append(",");
			}
		}
		return result.substring(0, result.length() - 1);
	}

	//함수형 처리
	//고계함수에 매개변수로 주어지는 함수(고계함수)를 이용.
	public String cleanNamesLambda(List names) {
		if (names == null) return "";

		return names.stream()
				.filter(name -> name != null)
				.filter(name -> name.length() > 1)
				.map(name -> capitalizeFirstLetter(name))
				.collect(Collectors.joining(","));
	}

	private String capitalizeFirstLetter(String s) {
		return s.substring(0, 1).toUpperCase() + s.substring(1, s.length());
	}
}

반응형