숨숨 베이스

지식이 숨어있는 공간

동작의 파라미터화

Last updated on November 30, 2025

1. 필요성

동작의 파라미터화는 Stream의 세부 동작 제어력을 높여 stream의 활용도를 향상시키기 위해 도입되었다.
가령 데이터를 정렬할 때, 오름차순, 내림차순 외에도 특정 기준으로 순서를 정해야할 일도 생긴다. 자바에서 매서드는 클래스나 객체 없이 존재할 수 없으므로, 특정한 기준을 제사히는 매서드를 만드려면, 클래스와 객체 생성부터 호출까지 전 과정을 다 해야 한다. 이렇듯 세부 동작 구현을 위한 불필요한 수고를 막기 위해 Java8에서는 동작을 나타내는 매서드도 파라미터로 전달할 수 있도록 개선되었다.

2. 정의

동작의 파라미터화는 '매서드의 일급화' 라고 하기도 한다. 매서드를 원시나 참조타입 값처럼 변수에 할당, 매서드 인수 및 반환 값으로 활용, 런타임에 생성 등이 가능해진 것이다.
이는 명령형 프로그래밍 기반인 java에서 함수형 프로그래밍의 아이디어를 일부 차용한 것이다.

3. 종류

동작의 파라미터화가 구현된 형태는 '함수가 기명함수이냐, 익명함수이냐' 에 따라 나눠진다.

A. 기명 함수 -> 매서드 참조

이미 존재하는 함수를 직접 가리켜서 활용하는 문법을 뜻한다. 해당 매서드 참조를 활용하면 코드의 가시성이 높아진다.
'java.io.file' 라이브러리의 함수들을 이용하여 루트 디렉토리 내에서 숨겨진 파일들만 가져오는 코드를 짠다고 해보자.
매서드 참조를 안 쓴 경우
File [] hiddenFiles = new File(".").listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.hidden(); } });
실제 필요한 것은 File 클래스 내부 함수인 hidden() 뿐인데, 이를 쓰기 위해 추가적인 코드들이 더 필요하다. java 8 이전에는 이렇게 익명 내부 클래스를 활용하여 세부 동작을 제어할 수 밖에 없었고 이는 코드의 가독성을 많이 떨어트렸다.

매서드 참조
File [] hiddenFiles = new File(".").listFiles(File::isHidden)
루트 디렉토리 내부의 모든 폴더와 파일에 대하여 그 파일 객체의 isHidden을 직접 참조하여 확인하라는 코드이다. 위의 코드보다 훨씬 깔끔해진 것을 알 수 있다.

B. 익명 함수 -> 람다식

내가 필요한 매서드가 위처럼 클래스에 존재한다면, 매서드 참조를 쓰면 되지만, 그렇지 않는 경우가 더 많을 것이다. 일회성으로 필요한 조건이나, 기존 클래스에 없는 매서드를 stream 내부에서 활용하기 위해서는 익명함수인 람다식을 활용한다.
람다식은 기본적으로 다음과 같이 이루어져 있다.
// 인수에는 변수 타입을 생략해도 된다. 컴파일러가 유추한다. (인수들...) -> { // 인수 활용 계산 조작 return 반환값 } (인수들...) -> (); // return 문만 존재하는 경우, return 생략하고 반환값만 적으면 됨.
위의 숨겨진 파일을 찾는 것도 람다식으로 표현하면 다음과 같다.
File [] hiddenFiles = new File(".").listFiles((f) -> f.isHidden());

부록

A. 모르는 것 정리

  • 일급값
    : 다음의 4가지 조건을 모두 지킨 값을 일급값이라고 한다.
      1. 변수에 할당이 가능하다.
      1. 매서드의 인수로 사용할 수 있다.
      1. 반환값이 될 수 있다.
      1. 런타임에 생성이 가능하다.
        이러한 일급값의 대표적인 종류로는 원시 타입, 참조 타입이 있다.
  • 이급값
    :저 위의 4가지 특징 중 하나라도 지키지 않으면 이급값이라고 부른다.
    전통적으로 클래스나 매서드가 이에 속한다.
  • 함수형 프르그래밍
    : 계산을 수학적인 함수 호출처럼 다루는 프로그래밍 기법, 다음 3가지를 충족해야 한다.
      1. 함수는 순수 함수다.
      1. 함수가 일급값이다.
      1. 선언적 처리 모델이어야 한다.
    • > 자바는 이 중 2번과 3번 아이디어를 차용해서 stream에 적용했다.
  • 순수 함수
    : 같은 Input에 대해서는 언제나 같은 output이 보장되는 함수 (멱등성)
    이를 위해서는 공유되는 가변 데이터에 대한 접근이 없어야 한다.
  • .listFiles()FileFilter()
    : 'java.io.files' 에 있는 매서드들이다.
    • listFiles()는 해당 디렉터리 내부의 모든 파일/폴더를 File[] 배열로 반환한다.
    • FileFilter()는 인터페이스로서 이 파일을 포함할지 말지를 true, false로 알려주는 함수이다.

⬅️ 이전 글
➡️ 다음 글