프로그래밍/함수형 프로그래밍

[함수형 프로그래밍] if문과 for문

mhko411 2021. 11. 5. 14:58
728x90

함수형 프로그래밍에서 if문과 for문 사용을 지양해야 한다고 책에서 읽고 공부를 하였다. 하지만 왜 그래야 하는 것인지 오랫동안 이해되지 않았고 시간이 지난 후에 다시 함수형 프로그래밍에 대해서 공부를하니 조금씩 이해가되어 정리를 하려고 한다.


10명의 사람들이 있다고 가정해보자. 여기서 각 사람들의 나이와 이름을 알고있고 10명의 사람 중에서 20살 이상인 사람들의 이름을 알아보려고한다. 이를 코드로 작성해보고 함수형 프로그래밍을 발전시키면서 if문과 for문을 왜 사용하면 안되는지 이해해보자.

const personList = [
  { age: 17, name: "alex" },
  { age: 15, name: "paul" },
  { age: 21, name: "harry" },
  { age: 27, name: "lee" },
  { age: 19, name: "park" },
  { age: 35, name: "john" },
  { age: 29, name: "dean" },
  { age: 32, name: "choi" },
  { age: 22, name: "james" },
  { age: 18, name: "kim" },
];

 

if문과 for문 사용하여 작성하기

위의 personList에서 20살이상인 사람들의 이름을 배열 형태로 반환하는 함수를 만들어보자. 

아래의 코드는 위의 문제를 해결하기 위해 작성할 수 있는 전형적인 코드이다. 20살이상인 사람들의 이름을 구하기 위해 어떻게 해야하는지 일련의 과정으로 나타내고 있다.

function getNameOfAdults(personList) {
  let adults = [];
  for (var i = 0; i < personList.length; i++) {
    if (personList[i].age >= 20) {
      adults.push(personList[i].name);
    }
  }
  return adults;
}

 

함수형 프로그래밍으로 발전하기

if문 제거하기

아래의 코드는 if문의 조건문을 제거하고 함수로 대체한 것이다. 기존에 "20살 이상인 사람들"이라는 표현에서 "성인"이라는 표현을 하면서 함수 내에서 무엇을 하는 것인지 명확하게 파악할 수 있게되었다.

이처럼 함수 내에서 무엇을 하는 것인지 쉽게 파악할 수 있다는 장점이외에 isAdult함수를 재사용할 수 있다는 장점도 존재한다. 기존의 if문의 조건문은 재사용이 불가능했지만 같은 역할을 하는 isAdult함수는 다른 함수에서도 사용할 수 있을 것이다.

function isAdult(person) {
  return person.age >= 20;
}

function getNameOfAdults(personList) {
  let adults = [];
  for (var i = 0; i < personList.length; i++) {
    if (isAdult(personList[i])) {
      adults.push(personList[i].name);
    }
  }
  return adults;
}

 

사람의 이름 가져오기

위의 코드에서 성인인 사람들의 객체에 접근하여 이름을 adults 배열에 추가하고 있다. 이를 객체의 이름을 반환하는 함수를 사용하여 대체해보자. 이를 통해 adults 배열에 무엇을 추가하는 것인지 더 명확하게 파악할 수 있게 되었다.

function getName(person) {
  return person.name;
}

function getNameOfAdults(personList) {
  let adults = [];
  for (var i = 0; i < personList.length; i++) {
    if (isAdult(personList[i])) {
      adults.push(getName(personList[i]));
    }
  }
  return adults;
}

 

for문 제거하기

마지막으로 위의 코드에서 for문을 제거하여 함수형 프로그래밍을 완성시켜보자. 기존의 for문을 filter와 map함수를 만들어 대체하였다. 아래의 코드는 filter에서 성인인 사람들을 반환하면 map에서 이름만 추출하여 반환하는 것이다. 이렇게 구현하면서 성인인 사람들의 이름을 어떻게 반환할 것인지에서 성인인 사람들의 이름(무엇을) 반환하는 것인지가 되었다.

또한 이 과정에서 for문을 제거하면서 var로 선언한 변수의 상태 변화가 없어졌으며 어떤 역할을 하는 함수인지 for문의 과정을 눈으로 따라가지 않아도 알 수 있게 되었다.

function filter(func, personList) {
  let result = [];
  for (person of personList) {
    if (func(person)) result.push(person);
  }
  return result;
}

function map(func, personList) {
  let result = [];
  for (person of personList) {
    result.push(func(person));
  }
  return result;
}

function getNameOfAdults(personList) {
  let adults = map(getName, filter(isAdult, personList));
  return adults;
}

결론

  • if문의 조건문을 제거하고 함수로 대체하면서 재사용이 가능해졌고 무엇을 하는 것인지 보다 쉽게 파악할 수 있게되었다.
  • for문을 제거하고 함수로 대체하면서 상태 변화가 없어졌으며 무엇을 하는 것인지 한 눈에 파악이 가능했다.
  • 함수형 프로그래밍은 선언형으로 "무엇을"에 집중한다. 이를 통해 함수가 어떤 기능을 하는 것인지 쉽게 파악이 가능한 것 같다는 생각을 하였다.