1급 객체

1급 객체(First-class citizen)는 프로그래밍 언어에서 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체입니다. 이는 객체를 변수에 할당하거나, 함수의 인자로 전달하거나, 함수의 반환값으로 사용할 수 있다는 것을 의미합니다.
1급 객체는 프로그래밍 언어의 중요한 특성 중 하나이며, 일반 적으로 변수나 데이터 구조에 저장할 수 있는 모든 것들이 1급 객체로 간주됩니다.


함수와 람다식

함수는 하나 이상의 작업을 수행하는 코드의 블록입니다. 함수는 입력을 받아서 처리를 하고, 결과를 반환하는 역할을 합니다. 함수는 이름, 매개변수, 반환값, 함수 내부의 코드로 구성됩니다.

람다식(Lambda expression)은 익명함수를 간단하게 표현하는 방법 중 하나입니다.
람다식은 함수를 정의할 때 함수의 이름이 필요 없으며, 간결한 문법으로 함수를 표현할 수 있습니다. 주로 함수를 다른 함수에 전달하거나 간단한 함수를 정의할 때 사용됩니다.
(람다식은 밑에서 다시 설명하도록 하겠습니다.)

람다식을 사용할 때는 =>를 사용해서 표현합니다.


함수의 파라미터

함수는 매개변수를 통해 외부에서 값을 받아들일 수 있습니다. 파라미터는 함수 정의 시 괄호 안에 선언되며, 함수를 호출할 때 전달되는 값들이 매개 변수에 할당됩니다.

파라미터는 이전 포스팅에서 한 번 설명한 적이 있으므로, 링크로 대체하도록 하겠습니다.
[Dart] Class와 Instance, Constructor


함수와 메서드의 차이

함수형 프로그래밍에서는 함수를 다른 함수에 전달하는 것이 일반적입니다.
이는 함수를 값으로 취급할 수 있다는 것을 의미합니다. 입출력 타입만 같다면 같은 함수로 볼 수 있다는 것을 의미하기도 합니다.

함수를 값으로 전달하면 코드의 재사용성이 높아지고, 유연한 프로그래밍이 가능해집니다.
이때, 함수와 메서드의 차이점은 함수가 클래스에 속하지 않는다는 것입니다. 메서드는 클래스의 멤버로서 특정한 객체에 속해있는 함수를 의미합니다.


람다식과 익명함수

람다식(Lambda expression)은 익명 함수를 간결하게 표현하는 방법입니다. 익명 함수(Anonymous functions)란 이름이 없는 함수로, 주로 간단한 연산이나 콜백 함수로 사용됩니다. 람다식은 일회성 함수를 간단하게 표현하기 위해 사용되며, 주로 함수형 프로그래밍(코틀린, 다트)에서 활용됩니다.


함수형 프로그래밍

위에서도 한번 나왔던 함수형 프로그래밍(FP, Functional Programming)은 프로그램을 함수들의 조합으로 작성하는 프로그래밍 패러다임입니다. 함수형 프로그래밍은 상태 변경을 피하고, 불변성을 강조하여 부작용(버그)을 최소화하려는 목적을 가지고 있습니다. 함수형 프로그래밍은 간결하고 읽기 쉬운 코드를 작성할 수 있으며, 병렬 처리 등의 이점을 가집니다.


고계 함수

고계 함수(higher-order function)는 함수를 인자로 받거나 함수를 반환하는 함수를 말합니다. 여러 고계 함수가 존재하며, 여기서는 몇 가지만 설명하겠습니다.

  • where

    조건을 만족하는 요소들을 필터링하는 함수입니다.
  • map

    List나 Collection의 각 요소에 함수를 적용하여 변환하는 함수입니다.
  • forEach

    List나 Collection의 각 요소에 함수를 적용하는 함수입니다.
  • reduce

    List나 Collection의 요소를 하나의 값으로 줄여나가는 함수입니다.
  • fold

    reduce와 유사하지만 초기값을 지정할 수 있는 함수입니다.
  • any

    조건을 만족하는 요소가 하나라도 있는지 확인하는 함수입니다.
  • toList

    List 타입으로 변환하는 함수입니다.
  • toSet

    Set 타입으로 변환하는 함수입니다.

이렇게 함수형 프로그래밍에서는 다양한 고계 함수를 활용해 간결하고 유연한 코드를 작성할 수 있습니다.


🌠 포스팅을 마치며

저도 reduce를 사용해 보고싶었는데.. 장렬히 실패했습니다. 왜 안에서 max와 min 사용이 안되는 건지 참 모르겠습니다.. 블로그도 찾아보고, gpt한테도 물어보고 해봤는데, 왜 안되는 건지는 안알려주고, fold로 사용하는 방법을 추천해줘서 그걸로 결국 바꿔버린..

profile
| App Developer | 제가 한 개발을 읽는 사람이 이해하기 쉽게 쓰려고 노력합니다.

0개의 댓글