- [Java] 람다식, 일급 객체 그리고 문과 식의 이해2025년 06월 21일 21시 17분 31초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
자바 람다식, 일급 객체 그리고 문과 식의 이해
자바 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)란?
일급 객체는 프로그래밍 언어에서 다른 요소들과 동등하게 다루어질 수 있는 대상을 의미한다. 어떤 것이 일급 객체로 인정받기 위해서는 주로 다음의 세 가지 조건을 만족해야 한다.
- 변수나 상수에 할당할 수 있다.
- 대상을 변수에 저장하고 재사용할 수 있어야 한다.
- 다른 함수의 인자로 전달할 수 있다.
- 함수를 호출할 때 해당 대상을 입력 값으로 넘겨줄 수 있어야 한다.
- 다른 함수의 반환값으로 전달할 수 있다.
- 함수가 연산의 결과로 해당 대상을 반환할 수 있어야 한다.
자바 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)**은 코드를 구성하는 기본적인 요소이다.
- 문(Statement)
- 특정 작업을 수행하도록 지시하는 코드이다.
- 값을 반환하지 않으며, 주로 어떤 행동을 명령하는 역할을 한다.
- 예시:
int x;
(변수 선언),x = 10;
(값 할당),if (조건) { ... }
(조건문) 등이 있다. 문은 보통 세미콜론(;)으로 끝난다.
- 식(Expression)
- 평가되어 하나의 결과 값으로 귀결되는 코드 조각이다.
- 항상 어떤 값을 반환하는 특징을 가진다.
- 예시:
1 + 2
(산술 연산),Math.random()
(메서드 호출 결과),"hello"
(리터럴) 등이 있다.
예를 들어,
int result = 10 * 5;
라는 코드를 보자. 여기서10 * 5
는50
이라는 값을 생산하는 식이다. 그리고int result = ...;
는 이 값을result
라는 변수에 할당하라는 문이다. 따라서 전체 라인은 하나의 문이다.
4. 람다식이 '식'인 본질적인 이유
람다식은 그 자체로 **하나의 값(함수형 인터페이스의 인스턴스)**을 생산해내는 역할을 하므로 '식'으로 분류된다.
- 값으로 평가되는 람다식: 람다식은 컴파일 시점에 해당 함수형 인터페이스의 구현체로 변환되며, 이 구현체는 곧 값이다. 이 값이 변수에 할당될 수 있고, 메서드의 인자로 전달될 수 있으며, 메서드의 반환값이 될 수 있다. 이는 '식'의 가장 중요한 특징인 값으로 평가될 수 있다는 조건에 부합한다.
- 간결한 표현식 바디: 람다식의 바디가
(a, b) -> a + b
처럼 단일 표현식인 경우, 람다식은 해당 표현식의 결과를 자동으로 반환한다. 이는 람다식이 값을 생산하는 '식'의 본질을 명확히 보여준다. 비록 바디가{ statements; return value; }
와 같은 블록문 형태라도, 이 블록 전체는 결국 하나의 함수를 정의하는 값으로 간주된다.
결론적으로, 자바의 람다식은 단순한 코드 블록이 아니라, 함수 그 자체를 값처럼 다룰 수 있게 해주는 '식'이다. 이는 자바가 함수형 프로그래밍 패러다임을 받아들이고, 코드를 더 유연하고 강력하게 작성할 수 있도록 돕는 핵심적인 변화이다.
728x90반응형'언어·프레임워크 > Java' 카테고리의 다른 글
[Java] Wrapper 클래스를 사용하는 이유와 실제 예제 (1) 2025.06.15 [Java] 자바의 컬렉션은 왜 '프레임워크'라고 불릴까? 라이브러리와의 결정적 차이! (1) 2025.06.15 [Java ] `System.identityHashCode()`와 `hashCode()` 메서드의 차이점 (1) 2025.06.14 [Java] 인터페이스 개념을 USB로 이해하기 (2) 2025.06.08 [Java] 정보 은닉과 캡슐화: 객체 지향 프로그래밍의 핵심 원칙 (3) 2025.06.08 다음글이 없습니다.이전글이 없습니다.댓글