본문 바로가기

2주차

함수형 프로그래밍 찍먹

 

2주차 세미나에서 일급객체, 고차함수에 대해서 들으며 함께 등장한 키워드 “함수형 프로그래밍”

그래서 2주차 공유 과제에서는 함수형 프로그래밍에 대해서 알아보도록 하겠습니다.

그전에 자바스크립트에서 함수가 어떤 특징을 가지고 있는지 복습해 보겠습니다!

 

자바스크립트의 함수는 일급 객체이기 때문에 값으로 취급할 수 있다.

자바스크립트의 함수는 "일급 객체"입니다. 일급 객체는 “함수를 데이터 다루듯이 다룰 수 있다"는 의미입니다.

일급 객체의 조건

  • 변수에 할당할 수 있다.
  • 다른 함수의 인자로 전달할 수 있다.
  • 다른 함수의 결과로 반환할 수 있다.

즉 자바스크립트의 함수는 데이터처럼 다룰 수 있기 때문에 "일급 객체"라고 불리며 이러한 특성 덕분에 여러 프로그래밍 기법이 가능해집니다.

 

일급 객체의 특성으로 가능해지는 것들

1. 고차 함수 사용

고차 함수 : 함수를 전달인자(argument)또는 매개변수(parameter)로 받거나 함수를 리턴하는 함수

 

자바스크립트에서는 함수가 일급 객체이기 때문에 함수를 다른 함수의 인자로 전달하거나 함수에서 함수를 반환하는 형태의 고차 함수를 자유롭게 사용할 수 있습니다. 이는 코드의 재사용성과 추상화 수준을 높여 복잡한 작업을 보다 단순한 구성 요소로 나눌 수 있게 해줍니다.

예로 배열의 map, filter, reduce와 같은 메서드들은 모두 고차 함수의 예시입니다. 이들은 모두 콜백 함수를 인자로 받아서 특정 로직을 배열에 적용합니다.

2. 콜백 함수 사용

콜백 함수: 전달인자(argument)로 받는 함수로 인자로 넘겨지는 함수를 콜백함수라고 한다.

 

보통 함수를 등록하기만 하고 어떤 이벤트가 발생했거나, 특정 시점에 도달했을 때 시스템에서 호출하는 함수로 사용합니다. 또 비동기 처리에서도 서버에서 데이터를 받아오거나 타이머가 완료되는 순간에 호출되는 등의 작업에서 콜백 함수가 사용됩니다.

3. 클로저 

클로저 : 어떤 함수가 함수를 반환할 때, 반횐되는 함수가 외부 변수를 참조하고 있어서 사라지지 않는 변수. 혹은 해당 함수나 현상을 의미

 

클로저를 이용하면 함수 내부에서 선언된 변수를 외부에서 참조할 수 없도록 캡슐화하여 데이터 은닉을 구현할 수 있습니다. 또 함수의 상태를 기억하여 나중에 다시 사용할 수 있는 '메모리' 역할을 합니다.

이러한 클로저의 특성은 함수형 프로그래밍의 주요 기법 중 하나인 커링(currying)에도 사용됩니다. 커링은 여러 개의 인자를 받는 함수를 단일 인자 함수들의 체인으로 변환하는 기법입니다.

 

함수형 프로그래밍이란?

함수형 프로그래밍: 무엇을 할것인지에 집중하는 선언형 패러다임의 일부로 거의 부작용이 없는 순수 함수 , 상태 예측 가능성을 유지하기 위한 불변성, 참조 투명성 등의 특징으로 가진다.

 

함수형 프로그래밍의 주요 특징은 다음과 같습니다

1. 순수 함수 (Pure Function)

순수 함수 : 동일한 입력에 대해 항상 동일한 출력을 반환하며 외부 상태를 변경하거나 외부 상태에 의존하지 않는 함수이다.

 

이러한 순수 함수의 장점은 다음과 같습니다:

  • 예측 가능성: 동일한 입력에 대해 항상 동일한 결과를 반환하므로, 코드의 예측 가능성이 높아집니다.
  • 테스트 용이성: 외부 상태에 의존하지 않기 때문에 단위 테스트가 용이합니다.
  • 병렬 처리 가능: 외부 상태를 변경하지 않으므로 데이터 경쟁 문제가 발생하지 않아 병렬 처리에 유리합니다.

2. 불변성 (Immutability)

불변성 : 메모리 영역에서 값이 변하지 않도록 하는 것을 의미

 

함수형 프로그래밍에서는 데이터의 불변성을 중요시합니다. 불변성은 데이터를 변경하지 않고 기존 데이터를 복사하여 새로운 데이터를 생성하는 방식으로 작업합니다. 이를 통해 상태 변경에 따른 부작용을 방지하고 코드의 안정성을 높일 수 있습니다.

// 데이터 불변성을 유지하지 않은 예제
class Web {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  setAge(age) {
    this.age = age; // 원본 객체의 age 값을 직접 변경 -> 불변성에 어긋남!
  }
}
// 데이터 불변성을 유지한 예제
class Web {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  setAge(age) {
    return new Web(this.name, age); // 새로운 객체를 반환하여 원본 객체를 수정하지 않음
  }
}

이처럼 불변성을 유지하는 코드를 작성하면, 코드의 상태 변화를 쉽게 추적할 수 있고, 복잡한 버그를 예방할 수 있습니다.

3. 참조 투명성 (Referential Transparency)

참조 투명성이란 표현식이 동일한 입력에 대해 동일한 결과를 항상 반환하는 것을 의미합니다. 이는 프로그램의 일관성을 유지하게 해주며, 코드 최적화에도 도움이 됩니다. 즉, 참조 투명성이 보장되는 코드는 동일한 표현식을 언제든지 그 값으로 대체할 수 있기 때문에 가독성과 유지보수성이 높아집니다.

 

함수형 프로그래밍을 왜 사용하는가

함수형 프로그래밍은 데이터와 상태 변경에 따른 부작용을 최소화하고 코드를 더 예측 가능하고 안전하게 만들어 줍니다.

자바스크립트는 이러한 함수형 프로그래밍의 요소들을 많이 포함하고 있으며 이를 잘 활용하면 코드의 재사용성과 유지보수성을 크게 높일 수 있다고 합니다! 함수형 프로그래밍에 대해서 공부하다보면 모나드도 접하게 되실텐데 모나드를 이해하시면 저에게도 꼭 알려주세요! 하핫 그럼 안뇽