메서드 참조


  • 메서드 참조 람다식을 더욱 간단히 표현한 것이다. 
  • 단, 항상 간단히 사용할 수 있는것은 아니고, 람다식이 하나의 메서드만 호출하는 경우에는 ‘메서드 참조(method reference)’라는 방법으로 람다식을 간략히 할 수 있다
  • 참조하는 종류는 1. static 메서드 참조와 2. 인스턴스메서드 참조가 있다.
  • 표현방식은 다음과 같다 
클래스 이름::메서드 이름
  • 메서드는 다른 클래스에도 동일한 이름이 존재할 수 있기 때문에 앞에 클래스 이름은 반드시 필요하다.

 

  • 람다식의 일부가 생략되었지만, 컴파일러는 생략된 부분을 우변의 parselnt메서드의 선언부로부터, 또는 좌변의 Function인터페이스에 지정된 지네릭 타입으로부터 쉽게 알아내는 식이다.
  • 특정 객체 인스턴스메서드 참조는 사용빈도가 낮다. 

  • 반환형이 Integer인 static 메서드를 람다식으로 표현하면 다음과 같다. 
  • Function<String, Integer> f = (String s) -> Integer.parseInt(s);
  • 이때 Function 타입으로 받은 이유는 입력값과 출력값이 하나씩 존재하기 때문이다. 
  • (String s) 는 생략이 가능하다. 왜냐하면 이미 Funtion의 입력값으로 작성되어있기때문에 유추가 가능하기 때문이다.
  • 입력 변수를 의미하는 parseInt(s)의 (s)역시 생략가능하다.
  • 이미 반환형에 입력값이 존재함이 명시되어있기 때문이다. 
  • 메서드 참조형의 표현방식인 클래스명::메소드명으로 변환하면 다음과같다. 
  • Integer::parseInt

 

 

 

  • 메서드 참조를 사용할 수 있는 경우가 한가지 더 있는데,
  • 이미 생성된 객체의 메서드를 람다식에서 시용한 경우에는 클래스 이름 대신 그 객체의 참조변수를 적어줘야 한다.
  • 하나의 메서드만 호출하는 람다식은 ‘클래스이름::메서드이름’또는‘참조변수::메서드이름’으로 바꿀 수 있다.

 

 

 

 

  • 예제로 테스트 해본다. 
  • 입력값과 출력값이 존재하므로 java.util.function 패키지 내 Function 메소드를 사용한다.
  • 그러므로 메소드 옆 <T, R> 값은 각각 입출력이 된다. 
  • 이를 람다식으로 표현하면 다음과 같을 것이다. 

 

 

  • 메소드 참조형은 람다식을 더 간단히 작성하여 [클래스이름::메소드이름]으로 작성하기로 하였으므로 
  • 클래스 이름자리에는 Integer가, 메소드 이름자리에는 parseInt가 들어가면 된다. 
  • 생략이 가능한 이유는 참조형 메서드인 Function메서드에서 이미 입출력값의 유무, 입출력값의 형식 등이 유추가 가능하기 때문이다. 
  • 연습을 위해 메소드 참조형을 다시 람다식으로 바꿔보는것도 좋다.  

 

 

생성자의 메서드 참조


  • 생성자를 호출하는 람다식도 메서드 참조로 변환할 수 있다.
  • 클래스명::new 로 작성한다.
  • 입력값이 없을때는 반환값, 즉 새로운 객체만 계속적으로 반환하므로 java.util.function 패키지 내 Supplier 메서드를 사용한다.
  • 입력값이 있을때는 입력값, 반환값이 하나씩 있으므로 java.util.function 패키지 내 Function 메서드를 사용한다.

 

 

 

  • 입력값이 2개 인경우엔 BiFunction<T, U, R>을 사용한다.
  • 이때 입력값은 T, U에 해당한다.

 

 

  • 배열을 메서드 참조하기 위해서 메서드의 반환값을 배열형식으로 지정한다.
  • Funtion<Integer, int[ ]> ... 와 같이 사용한다.
  • 이를 생성자의 메서드 참조형으로 바꿀시엔 클래스명자리에 배열타입( int[ ] ) 을 사용한다. 

 

 

예제를 통해 생성자호출을 메서드 참조를 이용해 표현해보자.

생성자 호출시 입력값은 없고 새로운 객체만 계속해서 반환하고싶으므로 Supplier를 사용한다.

Supplier의 기본 메소드는 get 이다. 

 

 

  • 생성자의 메소드 참조형은 클래스이름::new 로 작성한다.

 

 

  • 새로운 객체를 반환하므로 두번 생성된 객체는 같은 대상이아니다. 
  • 콘솔창의 결과를 보면 각각 생성된 객체의 주소값이 다른 것을 확인할 수 있다. 

 

 

  • 입력값이 있는 생성자 생성에서도 메서드 참조형은 MyClass::new로 동일하게 작성된다.
  • 입력값 (i)가 생략된 이유는 Function 메소드 탓이다. 
  • 해당메소드는 입력값과 출력값이 하나씩 있는 경우에 사용하므로,
  • 이미 입력값이 있다는 것과 그 입력값의 타입은 Integer이란 것을 유추할 수 있기 때문이다.

 

 

  • 반환타입이 배열타입일 때도 메서드 참조형은 동일하게 작성한다.
  • 배열생성시엔 반드시 Function 메서드를 사용해야한다.
  • 입력값과 출력값이 둘다 있기 때문인데 
  • 이때 입력값은 배열의 길이, 출력값은 배열이 될 것이다. 

 

 

 

 

 

 

 

+ Recent posts