본문 바로가기

개발지/Today I learn

[0825] 자바 람다식 (메서드 레퍼런스)

#메서드 참조

- 람다식에서 불필요한 매개변수를 제거할 때 사용한다.

- 인터페이스의 추상 메서드의 매개변수와 리턴 타입에 따라 달라진다.

- 메서드 참조는 정적 / 인스턴스 메서드와 생성자도 참조 가능하다.

- 메서드 참조의 기본 형태는 다음과 같다.

// 클래스이름 :: 메서드이름
// Math 클래스의 max() 정적 메서드를 참조

Math :: max // 메서드 참조

 

#정적 메서드와 인스턴스 메서드 참조

// 정적 메서드의 참조
클래스 이름 :: 메서드

// 인스턴스 메서드의 참조
(객체생성필요)참조 변수 :: 메서드

//Calculator.java
public class Calculator {
    public static int staticMethod(int x, int y) { // 정적 메서드
        return x + y;
    }
    
    public int instacneMethod(int x, int y) { // 인스턴스 메서드
        return x / y;
    }
}
import java.util.function.IntBinaryOperator;

public class MethodReferences {
    public static void main(String[] args) throws Exception {
        IntBinaryOperator operator;
        
        /* 정적 메서드
             클래스이름 :: 메서드이름
             */
        operator = Calculator::staticMethod;
        System.out.println("정적메서드 결과 : " + operator.applyAsInt(5, 2));
        
        /* 인스턴스 메서드
            인스턴스명::메서드명
            */
            
        Calculator calculator = new Calculator(); // 인스턴스 생성
        operator = calculator::instanceMethod;
        System.out.println("인스턴스 메서드 결과 : " + operator.applyAsInt(10, 2));
    }
}
// 출력값
정적메서드 결과 : 8
인스턴스 메서드 결과 : 5

 

#생성자 참조

- 생성자 참조는 객체 생성을 의미한다.

- 메서드 호출로 구성된 람다식을 메서드 참조로 대치하는 것과 같이,

  객체를 생성하고 리턴하도록 구성된 람다식은 생성자 참자로 대치할 수 있다.

- 생성자가 오버로딩 되어 여러개가 존재할 때, 컴파일러는 함수형 인터페이스의 추상 메서드와 동일한 매개 변수 타입과      개수가 있는 생성자를 찾아 실행한다. 만약 존재하지 않으면 에러가 발생한다.

// 생성자 참조 문법

클래스 :: new

// Member.java
public class Member {
    private String name;
    private String id;
    
    public Member() {
        System.out.println("Member() 실행");
    }
    
    public Memer(String id) {
        System.out.println("Member(String id) 실행");
        this.id = id;
    }
    
    public Member(String name, String id) {
        System.out.println("Member(String name, String id) 실행");
        this.id = id;
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    public String getId() {
        return id;
    }
}

- 아래 코드는 생성자 참조를 이용해 두 가지 방법으로 Member 객체를 생성하고 있다.

import java.util.function.BiFunction;
import java.util.function.Function;

public class ConstructorRef {
  public static void main(String[] args) throws Exception {
    Function<String, Member> function1 = Member::new; // 함수형 인터페이스의 메서드를 이용한 Member 객체 생성
    Member member1 = function1.apply("kimcoding");

    BiFunction<String, String, Member> function2 = Member::new; // 함수형 인터페이스의 Member 객체 생성
    Member member2 = function2.apply("kimcoding", "김코딩");
  }
}

/*
Member(String id) 실행
Member(String name, String id) 실행
*/