메서드 참조 ::

2024. 11. 22. 22:12Back-End/JAVA

반응형

Java에서 ::는 메서드 참조(Method Reference)를 나타내는 연산자입니다. 이 연산자는 람다 표현식을 더 간결하고 읽기 쉽게 표현하기 위해 사용됩니다. 


1. 메서드 참조의 기본 개념

:: 연산자는 이미 정의된 메서드를 참조하여, 람다 표현식을 간결하게 나타냅니다.

예: String::toUpperCase

  • 원래는 다음과 같은 람다 표현식으로 문자열을 대문자로 변환합니다: 
  • list.stream() .map(s -> s.toUpperCase()) .forEach(System.out::println);
  • 이를 메서드 참조를 사용하면 더 간결하게 작성할 수 있습니다:
    list.stream()
        .map(String::toUpperCase)
        .forEach(System.out::println);
    

2. 메서드 참조의 유형

::는 메서드 참조를 다양한 방식으로 사용할 수 있습니다. 대표적으로 4가지 유형이 있습니다:

(1) 정적 메서드 참조

정적 메서드를 참조하는 경우:

ClassName::staticMethodName

 

예)

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
numbers.stream()
       .map(Math::abs)  // Math.abs 메서드 참조
       .forEach(System.out::println);

(2) 인스턴스 메서드 참조 (특정 객체)

특정 객체의 인스턴스 메서드를 참조하는 경우:

instance::methodName

 

예)

String prefix = "Hello, ";
Function<String, String> addPrefix = prefix::concat;
System.out.println(addPrefix.apply("World!"));  // 출력: Hello, World!

(3) 인스턴스 메서드 참조 (임의 객체)

임의 객체의 인스턴스 메서드를 참조하는 경우:

ClassName::methodName

 

예)

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
     .map(String::toUpperCase)  // String의 toUpperCase 메서드 참조
     .forEach(System.out::println);

(4) 생성자 참조

생성자를 참조하는 경우:

ClassName::new

예:

Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();  // 새로운 ArrayList 생성

3. 왜 메서드 참조를 사용할까?

  • 가독성 향상: 코드가 더 간결하고 직관적입니다.
  • 중복 제거: 메서드 이름을 명시하므로, 반복적인 람다 표현식을 줄일 수 있습니다.
  • 함수형 프로그래밍에 적합: Java 8 이후 스트림 API와 잘 어울립니다.

4. 메서드 참조 vs 람다 표현식

람다 표현식과 메서드 참조는 대부분 상호교환이 가능합니다.
하지만 메서드 참조를 사용할 수 있을 때는 권장됩니다.

예:

람다 표현식:

list.stream()
    .forEach(item -> System.out.println(item));

메서드 참조:

list.stream()
    .forEach(System.out::println);

5. 요약

::는 이미 정의된 메서드 또는 생성자를 참조하여 람다를 간결하게 표현하는 방법입니다.
주요 유형:

  1. 정적 메서드 참조 (ClassName::staticMethod)
  2. 특정 객체의 인스턴스 메서드 참조 (instance::method)
  3. 임의 객체의 인스턴스 메서드 참조 (ClassName::method)
  4. 생성자 참조 (ClassName::new)

메서드 참조를 활용하면 더 간결하고 읽기 쉬운 코드를 작성할 수 있습니다. 

반응형