프로그래밍 노트/JAVA

[JAVA] 메소드 참조

깡냉쓰 2019. 8. 7. 22:20
728x90
반응형

메소드 참조(Method References)


메소드를 참조해서 매개변수 리턴타입을 알아내어 람다식에서 불필요한 매개변수를 제거하는 것이 목적

정적 메소드와 인스턴스 메소드 참조


클래스::메소드 // 정적(static) 메소드 참조
참조변수::메소드 // 인스턴스 메소드 참조

예제코드)

public class Calculator {
    public static int staticAdd(int x, int y){
        return x+y;
    }

    public int instanceAdd(int x, int y){
        return x+y;
    }
}
public class MethodReferences {
    public static void main(String[] args) {
        List<String> strList = Arrays.asList("안녕", "하세요");
        strList.stream().forEach(System.out::println);

        // static 메소드 참조
        IntBinaryOperator operator;
        operator = (x, y) -> Calculator.staticAdd(x, y);
        System.out.println(operator.applyAsInt(1, 2));

        operator = Calculator::staticAdd; // 메소드 참조
        System.out.println(operator.applyAsInt(1, 2));

        // instance 메소드 참조
        Calculator calculator = new Calculator();
        operator = (x, y) -> calculator.instanceAdd(x, y);
        System.out.println(operator.applyAsInt(1, 2));

        operator = calculator::instanceAdd; // 메소드 참조
        System.out.println(operator.applyAsInt(1, 2));
    }
}

매개 변수의 메소드 참조


메소드는 람다식 외부의 클래스 멤버일 수도 있고, 람다식에서 제공되는 매개변수의 멤버일 수도 있다.

(a, b) -> a.a메소드(b)
a의클래스::instanceMethod

예제코드)

public class MethodReferences2 {
    public static void main(String[] args) {
        ToIntBiFunction<String, String> function;

        function = String::compareToIgnoreCase; // 매개 변수 메소드 참조
        System.out.println(function.applyAsInt("hello", "HELLO") == 0 ? "동일한 문자열" : "문자열 다름");
    }
}

생성자 참조


메소드 참조(method reference)방식으로 생성자도 참조할 수 있다.

(a, b) -> {return new 클래스(a,b);}
클래스::new

생성자가 여러개 오버로딩되어 있다면, 컴파일러는 functional interface의 추상 메소드 매개변수 타입과 개수가 같은 생성자를 찾아 실행한다.
예제코드)

public class Account {
    private String id;
    private String password;

    public Account(String id) {
        this.id = id;
    }

    public Account(String id, String password) {
        this.id = id;
        this.password = password;
    }
}
public class MethodReferences3 {
    public static void main(String[] args) {
        Function<String, Account> function1 = Account::new;
        Account account = function1.apply("아이디");

        BiFunction<String, String, Account> function2 = Account::new;
        Account account2 = function2.apply("아이디", "패스워드");

        System.out.println(account);
        System.out.println(account2);
    }
}

// Account{id='아이디', password='null'}
// Account{id='아이디', password='패스워드'}

참고서적 ) 이것이 자바다.

728x90
반응형