Dandy Now!
  • [Java] 람다식, 일급 객체 그리고 문과 식의 이해
    2025년 06월 21일 21시 17분 31초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    자바 람다식, 일급 객체 그리고 문과 식의 이해

    자바 8에 도입된 람다식은 익명 함수를 간결하게 표현하는 방식이다. 이는 코드를 더 효율적이고 가독성 있게 만들 뿐만 아니라, 자바에서 함수형 프로그래밍 스타일을 적용할 수 있게 해준다. 람다식을 제대로 이해하기 위해서는 일급 객체의 개념과 프로그래밍 언어의 기본 구성 요소인 **문(Statement)**과 **식(Expression)**의 차이를 아는 것이 중요하다.


    1. 람다식이란 무엇인가

    람다식은 단 하나의 추상 메서드를 가진 함수형 인터페이스의 인스턴스를 간결하게 생성하는 방법이다. 기존의 장황한 익명 클래스 대신 짧고 명확한 코드로 함수를 정의하고 사용할 수 있게 한다.

    • 코드 간결성: 불필요한 보일러플레이트 코드를 줄여, 코드의 핵심 로직에 집중하게 한다.
    • 가독성 향상: 짧고 명확한 표현으로 코드의 이해를 돕는다.
    • 함수형 프로그래밍 지원: 함수를 마치 데이터처럼 다룰 수 있게 하며, 스트림 API와 같은 자바 8의 새로운 기능들과 시너지를 낸다.
    // 람다식을 사용하지 않은 경우 (익명 클래스)
    Runnable oldRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("익명 클래스로 실행되는 코드이다.");
        }
    };
    new Thread(oldRunnable).start();
    
    // 람다식을 사용한 경우
    Runnable newRunnable = () -> System.out.println("람다식으로 실행되는 코드이다.");
    new Thread(newRunnable).start();

    2. 일급 객체(First-Class Citizen)란?

    일급 객체는 프로그래밍 언어에서 다른 요소들과 동등하게 다루어질 수 있는 대상을 의미한다. 어떤 것이 일급 객체로 인정받기 위해서는 주로 다음의 세 가지 조건을 만족해야 한다.

    1. 변수나 상수에 할당할 수 있다.
      • 대상을 변수에 저장하고 재사용할 수 있어야 한다.
    2. 다른 함수의 인자로 전달할 수 있다.
      • 함수를 호출할 때 해당 대상을 입력 값으로 넘겨줄 수 있어야 한다.
    3. 다른 함수의 반환값으로 전달할 수 있다.
      • 함수가 연산의 결과로 해당 대상을 반환할 수 있어야 한다.

    자바 8 이전에는 **함수(메서드)**가 일급 객체가 아니었다. 함수를 인자로 전달하거나 반환값으로 사용하려면 익명 클래스나 복잡한 디자인 패턴을 사용해야만 했다. 하지만 람다식의 도입으로 자바에서도 함수를 마치 일급 객체처럼 다룰 수 있게 되었다.

    import java.util.function.Consumer;
    import java.util.function.Function;
    
    public class FirstClassExample {
        public static void main(String[] args) {
            // 1. 람다식(함수)을 변수에 할당하는 예시
            Consumer<String> printer = message -> System.out.println("프린터: " + message);
            printer.accept("안녕하세요!"); // 변수에 할당된 람다식 사용이다.
    
            // 2. 람다식(함수)을 다른 함수의 인자로 전달하는 예시
            processData("데이터를 처리 중이다.", printer);
    
            // 3. 람다식(함수)을 다른 함수의 반환값으로 전달하는 예시
            Function<Integer, Integer> addFive = createAdder(5);
            System.out.println("결과: " + addFive.apply(10)); // 10에 5를 더한 15가 출력된다.
        }
    
        // Consumer를 인자로 받는 함수이다.
        public static void processData(String data, Consumer<String> processor) {
            processor.accept("처리할 데이터: " + data);
        }
    
        // Function을 반환하는 함수이다.
        public static Function<Integer, Integer> createAdder(int valueToAdd) {
            return num -> num + valueToAdd; // 람다식을 반환한다.
        }
    }

    3. 문(Statement)과 식(Expression)의 이해

    프로그래밍에서 **문(Statement)**과 **식(Expression)**은 코드를 구성하는 기본적인 요소이다.

    1. 문(Statement)
      • 특정 작업을 수행하도록 지시하는 코드이다.
      • 값을 반환하지 않으며, 주로 어떤 행동을 명령하는 역할을 한다.
      • 예시: int x; (변수 선언), x = 10; (값 할당), if (조건) { ... } (조건문) 등이 있다. 문은 보통 세미콜론(;)으로 끝난다.
    2. 식(Expression)
      • 평가되어 하나의 결과 값으로 귀결되는 코드 조각이다.
      • 항상 어떤 값을 반환하는 특징을 가진다.
      • 예시: 1 + 2 (산술 연산), Math.random() (메서드 호출 결과), "hello" (리터럴) 등이 있다.

    예를 들어, int result = 10 * 5;라는 코드를 보자. 여기서 10 * 550이라는 값을 생산하는 이다. 그리고 int result = ...;는 이 값을 result라는 변수에 할당하라는 이다. 따라서 전체 라인은 하나의 문이다.


    4. 람다식이 '식'인 본질적인 이유

    람다식은 그 자체로 **하나의 값(함수형 인터페이스의 인스턴스)**을 생산해내는 역할을 하므로 '식'으로 분류된다.

    • 값으로 평가되는 람다식: 람다식은 컴파일 시점에 해당 함수형 인터페이스의 구현체로 변환되며, 이 구현체는 곧 이다. 이 값이 변수에 할당될 수 있고, 메서드의 인자로 전달될 수 있으며, 메서드의 반환값이 될 수 있다. 이는 '식'의 가장 중요한 특징인 값으로 평가될 수 있다는 조건에 부합한다.
    • 간결한 표현식 바디: 람다식의 바디가 (a, b) -> a + b처럼 단일 표현식인 경우, 람다식은 해당 표현식의 결과를 자동으로 반환한다. 이는 람다식이 값을 생산하는 '식'의 본질을 명확히 보여준다. 비록 바디가 { statements; return value; }와 같은 블록문 형태라도, 이 블록 전체는 결국 하나의 함수를 정의하는 값으로 간주된다.

    결론적으로, 자바의 람다식은 단순한 코드 블록이 아니라, 함수 그 자체를 값처럼 다룰 수 있게 해주는 '식'이다. 이는 자바가 함수형 프로그래밍 패러다임을 받아들이고, 코드를 더 유연하고 강력하게 작성할 수 있도록 돕는 핵심적인 변화이다.

    728x90
    반응형
    댓글