순수 함수란 무엇인가?
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 소프트웨어 개발자 (특히 함수형 프로그래밍에 관심 있는 중급 이상 개발자)
- 난이도: 중간 (기초 개념 설명과 실무 예시 포함)
핵심 요약
- 순수 함수의 3대 규칙:
항상 단일 값 반환
(예:static int increment(int x) { return x + 1; }
)입력만 의존
(예:static int add(int a, int b) { return a + b; }
)외부 상태 변형 금지
(예:public static User addTag(User user, String tag) { ... }
)- 장점: 테스트 용이성, 예측 가능성, 병렬 처리 효율성
- 성능 트레이드오프: 불변성 유지 시 복사 비용 발생 (예: Java에서
new ArrayList<>(user.tags)
사용)
섹션별 세부 요약
1. 함수형 프로그래밍의 핵심 개념
- 자기 밀폐된 함수 설계: 입력값에만 의존하며, 외부 상태 영향 없음
- 재사용성: 동일한 입력에 대해 동일한 출력을 보장해 모듈 간 공유 가능
- 테스트 용이성: 사이드 이펙트 없음으로 단위 테스트 간단
2. 순수 함수의 정의와 규칙
- 규칙 1: 동일한 입력값에 대해 항상 동일한 출력값 생성 (예:
Math.random()
은 비순수) - 규칙 2: 외부 변수/시스템 상태와 무관하게 계산 (예:
static int add(int a, int b)
는 순수) - 규칙 3: 외부 데이터 변형 금지 (예:
user.tags.add(tag)
는 비순수, 대신 새 객체 생성)
3. 실무 예시와 트레이드오프
- 순수 함수 예시:
```java
public static int calculateTotalPrice(int pricePerItem, int quantity, int discountPercent) {
int total = pricePerItem * quantity;
int discount = total * discountPercent / 100;
return total - discount;
}
```
- 성능 고려사항:
- 대규모 데이터 처리 시 불변성 유지로 인한 복사 비용 발생
- JavaScript/Scala는 불변 컬렉션 기본 제공, Java는 수동 복사 필요
4. 순수 함수의 한계와 적용 시 고려사항
- 비순수 함수의 필요성: 성능 최적화를 위해 일부 경우 변형 허용
- 언어별 차이: Java는 불변성 유지 위해 수동 복사 필요, Scala/JavaScript는 기본 제공
결론
- 실무 팁: 순수 함수를 사용할 때는 성능 트레이드오프를 고려하고, 불변성 유지가 필수적임
- 예시:
List
함수에서 새로운 리스트 생성해 원본 변경 방지doubleAllValues(List numbers) - 핵심: 순수 함수는 예측성과 테스트 용이성을 제공하지만, 성능과 언어 특성에 따라 적용 전략을 조정해야 함