Java

메소드 참조

뽀루피 2024. 10. 21. 19:38

메소드 참조는 람다 표현식을 더 간결하게 작성할 수 있는 기능이다.

람다 표현식이 단순 기존 메소드를 호출하는 경우 사용할 수 있다.

 

메소드 참조의 기본 구조

 

  • 클래스 또는 객체 이름
  • 이중 콜론(::) 연산자
  • 메소드 이름

예시는 다음과 같다.

Integer::parseInt

 

 

 

메소드 참조의 종류

메소드 참조에는 4가지 유형이 있다.

 

1. 정적 메소드 참조 (Class::staticMethod)

다음과 같은 람다 표현식에 사용할 수 있다.

(String str) -> Integer.parseInt(str)

 

위의 식은 메소드 참조를 활용하면 다음과 같이 변경된다.

Integer::parseInt

 

2. 다양한 형식의 인스턴스 메소드 참조 (Class::instanceMethod)

다음과 같은 람다 표현식에 사용할 수 있다.

(String str) -> str.length()

 

위의 식은 메소드 참조를 활용하면 다음과 같이 변경된다.

 

 

String::length

 

3. 외부 객체의 인스턴스 메소드 참조 (object::instanceMethod)

다음과 같은 람다 표현식에 사용할 수 있다.

// Transaction 객체를 할당받은 expensiveTransaction 지역 변수가 있다 가정
() -> expensiveTransaction.getValue()

 

위의 식은 메소드 참조를 활용하면 다음과 같이 변경된다.

expensiveTransaction::getValue

 

4. 생성자 참조 (Class::new)

다음과 같은 람다 표현식에 사용할 수 있다.

// Supplier는 get 추상 메소드를 가지는 () -> T 형태의 함수형 인터페이스이다.
Supplier<Apple> c1 = () -> new Apple();
Apple a1 = c1.get();

 

위의 식은 메소드 참조를 활용하면 다음과 같이 변경된다.

Supplier<Apple> c1 = Apple::new;
Apple a1 = c1.get();

 

 

메소드 참조의 장점

  1. 가독성 향상: 람다 표현식보다 코드가 더 간결하고 직관적이다.
  2. 재사용성: 이미 존재하는 메소드를 재사용할 수 있어 중복 코드를 줄일 수 있다.
  3. 유지보수성: 람다 표현식에 비해, 메소드 참조는 해당 메소드가 무엇을 하는지 명확히 알 수 있어 유지보수성이 좋다.

 

메소드 참조의 단점

  1. 메소드 오버라이드 불가 : 기존 메소드를 호출하는 경우에 적합하지만, 동적으로 로직을 변경하거나 추가하는 것은 람다 표현식을 사용하는 것이 낫다.
  2. 디버깅 어려움 : 람다 표현식과 마찬가지로 디버깅 시 어떤 메소드에서 문제가 일어났는지 확인하기 어렵다.