도입
함수형 프로그래밍이나 자바 람다, 자바스크립트 콜백을 이야기할 때 반드시 등장하는 개념이 “함수는 1급 시민이다” 입니다. 그런데 이 말은 “함수가 중요하다” 같은 감성 표현이 아니라, 언어가 어떤 대상을 일반 값처럼 취급하게 해준다는 아주 구체적인 의미입니다.
“1급 시민 = 값처럼 이동 가능한 대상이다.
그래서 함수도 파라미터/반환값으로 다룰 수 있다.”
정의
“1급 시민”은 문법이 아니라 언어의 능력(표현력)을 말합니다.
숫자/문자열이 1급 시민인 언어는 많지만, 함수가 1급 시민인 언어는 더 강력한 추상화를 만들 수 있습니다.
1급 시민의 조건
왜 중요한가
실무에서 바뀌는 건 구현 디테일뿐 아니라 “정책”입니다. 예를 들어 할인 정책, 인증 정책, 라우팅 규칙, 재시도 전략 같은 것들입니다. 함수가 1급 시민이면, 이런 정책을 if/switch로 분기하는 대신 함수(전략)를 주입하거나 레지스트리에 등록해 깔끔하게 교체할 수 있습니다.
GOOD
- 정책을 함수/전략으로 분리 → 변경 범위 최소
- 테스트에서 가짜 함수로 쉽게 치환
- 핵심 로직이 if/switch로 오염되지 않음
BAD
- 정책이 분기문으로 퍼져 유지보수 비용 증가
- 새 케이스 추가 시 기존 로직을 계속 건드림
- 테스트에서 특정 분기 타기 어려움
실전 예시
// (개념 예시) 할인 정책을 "함수"로 주입한다
// - 언어/프레임워크에 따라 인터페이스/람다로 표현 가능
// discountFn: (price) -> discountAmount
int checkout(int price, java.util.function.IntUnaryOperator discountFn) {
int discount = discountFn.applyAsInt(price);
return price - discount;
}
// 사용
// checkout(10000, p -> (int)(p * 0.1)); // 10% 할인
// checkout(10000, p -> 1000); // 1000원 할인
💡 TIP / “전략 패턴”을 더 가볍게
OOP에서는 Strategy 인터페이스를 만들고 클래스를 늘리는 방식이 흔합니다. 함수가 1급 시민이면, 이런 전략을 “객체” 대신 “함수”로 표현해 더 간단하게 유지할 수 있습니다.
1급 시민 vs 1급 함수
정리
✅ 핵심 요약
- ✔️ 1급 시민은 대상을 “값처럼” 다룰 수 있다는 의미입니다.
- ✔️ 조건: 변수 할당/인자 전달/반환/자료구조 저장이 가능해야 합니다.
- ✔️ 함수가 1급이 되면 정책/전략을 함수로 주입해 설계를 단순화할 수 있습니다.
- ✔️ 백엔드에서는 “정책 변경/테스트/확장”을 쉽게 만드는 도구로 활용됩니다.