티스토리 뷰

매서드 참조 표현식

이중 콜론 연산자(::)는 람다식의 파라미터로 사용된다. 매서드 참조 표현식(method reference expression)이라는 정식 이름을 갖고 있다.

인스턴스명::메서드명

 

위와 같은 표현 방식을 사용한다. 인스턴스를 반복 생성 시에도 사용할 수 있는데 이때는 아래와 같이 사용한다.

인스턴스명::new

 

스태틱 메서드인 경우 인스턴스 대신 클래스 이름으로 사용할 수 있다. 말보다 예시가 쉬운 경우 이므로 아래와 같이 작성해봤다.

public class TestMain {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");
        list.stream().map(element -> element.toUpperCase())
                     .forEach(System.out::println);
    }
}
AAA
BBB
CCC
DDD

스트림을 통해 모두 대문자로 만들고, 한줄씩 출력하는데 list의 모든 값들이 동일하게 들어간다. 위 :: 사용 부분은 아래와 같은 코드이다.

forEach(s -> System.out.println(s))

 

인스턴스들에도 비슷하게 적용된다. 간단한 Person 클래스를 하나 생성했다.

class Person {
    private String name;
    private int age;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

이름 리스트를 생성하고 모두 대문자로 변환 후 출력하는 코드이다.

public class TestMain {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Kim", "Lee", "Choi", "Park");
        List<Person> personList =
                list.stream().map(element -> element.toUpperCase())
                                               .map(Person::new)
                                                .collect(Collectors.toList());
        List<Person> personList2 =
                list.stream().map(element -> element.toUpperCase())
                        .map(element -> new Person(element))
                        .collect(Collectors.toList());

        personList.stream().forEach(person -> System.out.println(person.getName()));
        personList2.stream().forEach(person -> System.out.println(person.getName()));
    }
}

personList와 personList2는 동일한 동작을 한다.

 

재밌는점은 String name이 단일 파리머터로 들어가는 person의 생성자를 만들어주지 않으면, Person::new 해주는 부분에서 에러가 발생한다. 아래와 같이 생성자를 여러개 만들어도 알아서 매칭된다.

public Person(String name) {
    this.name = name;
}

public Person(int age) {
    this.age= age;
}

public Person(String name, int age) {
    this.name = name;
    this.age= age;
}

이중콜론으로 축약해도 알아서 생성자가 매칭된 다음에 객체가 생성된다는 점이 편리하다.

sorted를 사용할 때도 어떤 것이 기준이 될지 아래와 같이 이중콜론 표현식을 활용하여 만들 수 있다.

List<Person> personList3 = personList.stream().sorted(Comparator.comparing(Person::getName)).collect(Collectors.toList());

 

Comparator가 여기서도 등장하는데, Comparator 클래스에 대해서도 정리할 필요성이 느껴진다.

 

마치며

함수형 인터페이스 람다 내에서 활용할 수 있고, 가독성을 높여주는 활용성 높은 표현식이라 생각된다... 굳이 쓸말이 없다. 어려운 내용이 아니기 때문에

 

'개발 > JAVA' 카테고리의 다른 글

모던 자바 인 액션(Modern Java in Action). 1장 요약  (0) 2023.01.29
[Java] 리스트 객체 내 중복 제거(List to Set)  (0) 2023.01.26
[JAVA] Optional 클래스  (1) 2023.01.26
[JAVA] Collectors  (1) 2023.01.26
[JAVA] Stream  (1) 2023.01.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함