티스토리 뷰

언어/Java

[Java]메서드 참조(Method Reference)에 대하여

꼬마우뇽이(원종운) 2022. 1. 6. 16:46

1편 - 람다식(Lambda Expression)에 대하여

2편 - 메서드 참조(Method Reference)에 대하여 - 현재 글


메서드 참조란?

앞서 살펴본 람다식을 통하여 우리는 함수 객체를 쉽게 만들 수 있었습니다. 하지만 대부분의 람다식은 내부에서 기존에 존재하는 클래스들의 메서드 하나만을 호출하는 경우가 많은 것을 경험적으로 알 수 있습니다. 이럴 경우 그냥 호출하는 메서드의 이름을 사용하여 간결하게 표현하는 것이 더욱 코드가 명확해집니다. 

 

메서드 참조는 람다식이 하나의 메서드만을 호출할 경우 메서드의 이름을 레퍼런스로 전달하여 사용하는 기법이다.

 

기존의 람다식을 메서드 참조로 바꾸는 방법

기존의 람다식이 인스턴스의 메서드를 호출하는지, 정적 메서드를 호출하는지, 특정 객체 인스턴스의 메서드를 참조하는지에 따라 바꾸는 방법이 조금은 다르지만 크게 동일하다. "클래스 이름::메서드 이름" 또는 "참조 변수::메서드 이름"의 형태로 변경할 수 있습니다.

 

IDE의 기능에 무조건적으로 의존하는 것은 좋지 않다고 보는 사람들도 있지만, IDE 제공하는 기능이 있다면 그것을 충분히 이용하다는 것도 좋다고 생각합니다. 기존의 람다식을 메서드 참조로 바꿀 때는 IDE의 도움을 적극적으로 받길 권합니다.

 

IDE의 도움을 받다 보면 경험에 의하여 어떻게 변환하여야 하는지 외우는 것이 아니라 그 규칙을 파악할 수 있을 것입니다.

 

메서드 참조 사용 예

생성자 메서드 참조

public class App {

    private static class Student {

    }

    public static void main(String[] args) {
        Supplier<Student> f1 = () -> new Student();
        // 생성자에 대하여 메서드 참조 사용
        Supplier<Student> f2 = Student::new;
    }
}

 

인스턴스 메서드 참조

public class App {

    public static void main(String[] args) {
        Function<String, Integer> f1 = s1 -> s1.length();
        // 인수의 인스턴스 메서드 length에 대하여 메서드 참조 사용
        Function<String, Integer> f2 = String::length;
    }
}

 

정적 메서드 참조

public class App {
    
    public static void main(String[] args) {

        Function<String, Integer> f1 = s -> Integer.parseInt(s);
        // Integer 클래스의 정적 메서드 parseInt에 대하여 메서드 참조 사용
        Function<String, Integer> f2 = Integer::parseInt;
    }
}

 

특정 인스턴스의 메서드 참조

public class App {

    public static void main(String[] args) {
        String str = "Hello";
        Function<String, Boolean> f1 = s1 -> str.equals(s1);
        // 특정 String 인스턴스 str의 length 메서드에 대하여 메서드 참조 사용
        Function<String, Boolean> f2 = str::equals;
    }
}

 

마무리

이렇게 Java에서 함수 객체를 생성하기 위하여 익명 클래스를 사용하는 시절부터, 더욱 간결하게 생성하기 위하여 도입된 람다식에 대하여 알아보았고, 그러한 람다식마저 더욱 간결하게 표현할 수 있는 메서드 참조 기법 또한 알아보았습니다.

 

결과적으로 이런 모든 과정은 프로그래머가 더욱 코드를 간결하고 명확하게 짜기 위해서 도입된 도구일 뿐입니다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함