메서드 참조

Jun·2025년 5월 26일

고급 자바

목록 보기
6/7

메서드 참조(Method Reference)란?

메서드 참조(Method Reference)는 자바 8에서 도입된 기능으로, 람다 표현식이 단순히 메서드 호출만 수행할 때, 이를 간결하게 표현할 수 있도록 도와주는 문법입니다. 이는 람다의 축약형으로 볼 수 있으며, 코드의 간결성, 가독성, 재사용성을 높여줍니다.

1. 왜 메서드 참조가 필요한가?

예제 1: 기본 람다 표현식

BinaryOperator<Integer> add1 = (x, y) -> x + y;
BinaryOperator<Integer> add2 = (x, y) -> x + y;
  • 문제점: 같은 기능의 람다를 반복 작성해야 함 → 유지보수 어려움

예제 2: 메서드 추출 후 람다 사용

BinaryOperator<Integer> add = (x, y) -> add(x, y);
static int add(int x, int y) { return x + y; }
  • 개선: 덧셈 로직을 메서드로 분리하여 중복 제거
  • 여전히 (x, y) -> add(x, y) 형태 반복

예제 3: 메서드 참조 적용

BinaryOperator<Integer> add = ClassName::add;
  • 장점: 람다를 더 간결하게 표현 가능

2. 메서드 참조 문법

람다 표현식: (x) -> 클래스.메서드(x)
메서드 참조: 클래스명::메서드명

3. 메서드 참조의 4가지 유형

1. 정적 메서드 참조

  • 문법: ClassName::staticMethod
  • 예: Math::max, Integer::parseInt

2. 특정 객체의 인스턴스 메서드 참조

  • 문법: object::instanceMethod
  • 예: person::introduce

3. 생성자 참조

  • 문법: ClassName::new
  • 예: Person::new

4. 임의 객체의 인스턴스 메서드 참조

  • 문법: ClassName::instanceMethod
  • 예: Person::introduce, String::toUpperCase

주의: 객체명이 아닌 클래스명을 사용한다는 점에서 2번과 구분됨. 실행 시점에 인스턴스를 매개변수로 받아 해당 메서드를 호출함.

4. 예제별 설명

예제: 임의 객체의 인스턴스 메서드 참조

Function<Person, String> f1 = (p) -> p.introduce();
Function<Person, String> f2 = Person::introduce;
  • 동일한 기능
  • 후자가 훨씬 간결하고 가독성 높음

예제: 메서드 체이닝에서 활용

List<String> result = list.stream()
    .map(Person::introduce)
    .map(String::toUpperCase)
    .toList();
  • map(person -> person.introduce())Person::introduce
  • map(s -> s.toUpperCase())String::toUpperCase

5. 메서드 참조의 동작 원리

  • 컴파일러는 함수형 인터페이스의 시그니처를 분석하여 자동으로 매개변수를 전달
  • 메서드 참조는 호출이 아니라 참조이므로 괄호 ()를 붙이지 않음

6. 활용

  • 스트림 API, 콜렉션 변환, 정렬 등에서 매우 자주 사용한다.
  • 람다 표현식이 단순한 메서드 호출이라면 메서드 참조를 우선 고려해야한다.

메서드 참조의 장점

  • 간결성: 람다 표현식보다 짧고 명확
  • 가독성: 의도 파악이 쉬움
  • 재사용성: 기존 메서드를 람다처럼 사용 가능
profile
꾸준하게

0개의 댓글