Java/객체지향

[객체지향][람다식/Lambda Expression] - 메서드 참조, 생성자의 메서드 참조

얄루몬 2022. 3. 12. 14:29

https://youtu.be/I55ALQndw50?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[메서드 참조]

  • 하나의 메서드만 호출하는 람다식은 메서드 참조로 더 간단히 할 수 있다.

[static 메소드 참조]

Integer method(String s) {
    return Integer.paraseInt(s);
}

Function<String, Integer> f = (String s) -> Integer.parseInt(s);
  • 그저 Integer.parseInt(String s)만 호출하는 걸 볼수 있다.
  • 이는 그냥 람다식을 사용해서 간단히 할 수 있다.
package javajungsuk;

import java.util.function.Function;

public class Java14_0 {

	public static void main(String[] args) {
//		Function<String, Integer> f = (String s) -> Integer.parseInt(s);
//		Function<String, Integer> f = 클래스이름::메서드이름;
		Function<String, Integer> f = Integer::parseInt;
		System.out.println(f.apply("100"));
		
	}

}

[생성자의 메서드 참조]

[입력이 없이 주기만 하는 경우 supplier( ) / 매개변수가 없는 경우]

Supplier<MyClass> s = () -> new MyClass();

Supplier<MyClass> s = () -> MyClass::new;

[생성자에 매개변수 있는 경우]

Function<Integer, MyClass> s = (i) -> new MyClass(i);

Function<Integer, MyClass> s = MyClass::new;

[배열과 메서드 참조]

Function<Integer, int[]> f = x -> new int[x]; //람다식
Function<Integer, int[]> f2 = int[]::new; //메서드 참조
  • 배열타입 :: new; 이렇게 쓰는 걸 많이 쓴다고 한다.

[실습]

[매개변수가 없는 경우(공급자의 경우)]

package javajungsuk;

import java.util.function.Supplier;

public class Java14_5 {
	public static void main(String[] args) {
	
//		Supplier<MyClass> s = () -> new MyClass();
		Supplier<MyClass> s = MyClass::new;
		
		MyClass mc = s.get();
		System.out.println(mc);
		System.out.println(s.get());
		
	}
}
class MyClass{}
javajungsuk.MyClass@46f5f779
javajungsuk.MyClass@1c2c22f3
  • 서로 다른 객체가 생성된 것을 볼수 있다. 

[매개변수가 있는 경우]

package javajungsuk;

import java.util.function.Function;
import java.util.function.Supplier;

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

		Function<Integer,MyClass> f = (i) -> new MyClass(i);
//		Function<Integer, MyClass> f = MyClass::new;
		
		MyClass mc = f.apply(100);
		System.out.println(mc.iv);
		
	}
}
class MyClass{
	int iv;
	MyClass(int iv){
		this.iv = iv; 
	}
}
100
100

[배열의 경우]

package javajungsuk;

import java.util.function.Function;
import java.util.function.Supplier;

public class Java14_5 {
	public static void main(String[] args) {
    
		Function<Integer, int[]> f2 = (i) -> new int[i]; //람다식
		Function<Integer, int[]> f3 = int[]::new; //메서드 참조
		int[] arr = f2.apply(100);
		
		System.out.println("arr.length = " + arr.length);
	}
}
class MyClass{
	int iv;
	MyClass(int iv){
		this.iv = iv; 
	}
}
arr.length = 100