PHpullh
학습 라이브러리/Java/순수 함수와 참조 투명성

JAVA · 함수형/Stream

순수 함수와 참조 투명성

순수 함수의 조건과 참조 투명성이 코드 품질에 미치는 영향을 알아봅니다.

함수형/Stream중급순수함수참조투명성부수효과함수형

핵심 설명

순수 함수의 조건과 참조 투명성이 코드 품질에 미치는 영향을 알아봅니다.

Java code

import java.util.*;
import java.util.function.*;

public class PureFunction {
    // 순수 함수: 같은 입력 -> 항상 같은 출력, 부수 효과 없음
    static int add(int a, int b) { return a + b; }
    static String greet(String name) { return "Hello, " + name; }

    // 비순수 함수: 외부 상태에 의존
    static int counter = 0;
    static int impureCount() { return ++counter; } // 부수 효과!

    // 순수 함수로 변환: 상태를 인자로 전달
    static int pureCount(int current) { return current + 1; }

    // 참조 투명성: 함수 호출을 결과값으로 대체 가능
    // add(2, 3) -> 항상 5로 대체 가능 (참조 투명)
    // impureCount() -> 대체 불가 (참조 불투명)

    // 실전: 순수 함수 파이프라인
    static List<String> processNames(List<String> names) {
        return names.stream()
            .map(String::trim)          // 순수
            .filter(s -> !s.isEmpty())  // 순수
            .map(String::toUpperCase)   // 순수
            .sorted()                   // 순수
            .toList();                  // 순수
    }

    public static void main(String[] args) {
        List<String> input = List.of("  Bob ", "Alice", "", "Charlie ");
        List<String> result = processNames(input);
        System.out.println(result); // [ALICE, BOB, CHARLIE]
        System.out.println(input);  // 원본 불변
    }
}

학습 팁

순수 함수는 테스트하기 쉽고, 캐싱(메모이제이션)이 가능하며, 병렬 실행에 안전합니다. 가능하면 순수 함수로 작성하세요.

주의할 점

스트림의 forEach에서 외부 변수를 수정하는 것은 순수하지 않습니다. collectreduce로 결과를 모으세요.

자주 묻는 질문

순수 함수와 참조 투명성란 무엇인가요?

순수 함수의 조건과 참조 투명성이 코드 품질에 미치는 영향을 알아봅니다.

순수 함수와 참조 투명성 학습 시 주의할 점은 무엇인가요?

스트림의 forEach 에서 외부 변수를 수정하는 것은 순수하지 않습니다. collect 나 reduce 로 결과를 모으세요.