Java는 Java 8에서 메소드 참조라는 새로운 기능을 제공합니다. 메소드 참조는 기능적 인터페이스의 메소드를 참조하는 데 사용됩니다. 람다 표현의 간결하고 쉬운 형태입니다. 메서드를 참조하기 위해 람다 식을 사용할 때마다 람다 식을 메서드 참조로 바꿀 수 있습니다. 이번 튜토리얼에서는 메소드 참조 개념을 자세히 설명하고 있습니다.
메소드 참조 유형
Java에는 다음과 같은 유형의 메소드 참조가 있습니다.
- 정적 메서드에 대한 참조입니다.
- 인스턴스 메서드에 대한 참조입니다.
- 생성자에 대한 참조입니다.
1) 정적 메소드에 대한 참조
클래스에 정의된 정적 메소드를 참조할 수 있습니다. 다음은 Java에서 정적 메소드를 참조하는 과정을 설명하는 구문과 예제입니다.
통사론
ContainingClass::staticMethodName
실시예 1
다음 예제에서는 기능적 인터페이스를 정의하고 정적 메서드를 해당 기능적 메서드인 say()로 참조했습니다.
interface Sayable{ void say(); } public class MethodReference { public static void saySomething(){ System.out.println('Hello, this is static method.'); } public static void main(String[] args) { // Referring static method Sayable sayable = MethodReference::saySomething; // Calling interface method sayable.say(); } }지금 테스트해보세요
산출:
Hello, this is static method.
실시예 2
다음 예에서는 미리 정의된 기능 인터페이스 Runnable을 사용하여 정적 메서드를 참조합니다.
public class MethodReference2 { public static void ThreadStatus(){ System.out.println('Thread is running...'); } public static void main(String[] args) { Thread t2=new Thread(MethodReference2::ThreadStatus); t2.start(); } }지금 테스트해보세요
산출:
Thread is running...
실시예 3
미리 정의된 기능 인터페이스를 사용하여 메서드를 참조할 수도 있습니다. 다음 예에서는 BiFunction 인터페이스와 해당 인터페이스의 apply() 메서드를 사용하고 있습니다.
import java.util.function.BiFunction; class Arithmetic{ public static int add(int a, int b){ return a+b; } } public class MethodReference3 { public static void main(String[] args) { BiFunctionadder = Arithmetic::add; int result = adder.apply(10, 20); System.out.println(result); } }지금 테스트해보세요
산출:
30
실시예 4
메서드를 참조하여 정적 메서드를 재정의할 수도 있습니다. 다음 예에서는 세 가지 add 메서드를 정의하고 오버로드했습니다.
import java.util.function.BiFunction; class Arithmetic{ public static int add(int a, int b){ return a+b; } public static float add(int a, float b){ return a+b; } public static float add(float a, float b){ return a+b; } } public class MethodReference4 { public static void main(String[] args) { BiFunctionadder1 = Arithmetic::add; BiFunctionadder2 = Arithmetic::add; BiFunctionadder3 = Arithmetic::add; int result1 = adder1.apply(10, 20); float result2 = adder2.apply(10, 20.0f); float result3 = adder3.apply(10.0f, 20.0f); System.out.println(result1); System.out.println(result2); System.out.println(result3); } }지금 테스트해보세요
산출:
30 30.0 30.0
2) 인스턴스 메소드 참조
정적 메서드와 마찬가지로 인스턴스 메서드도 참조할 수 있습니다. 다음 예제에서는 인스턴스 메서드를 참조하는 과정을 설명합니다.
통사론
containingObject::instanceMethodName
실시예 1
다음 예에서는 비정적 메서드를 참조합니다. 클래스 객체와 익명 객체로 메서드를 참조할 수 있습니다.
interface Sayable{ void say(); } public class InstanceMethodReference { public void saySomething(){ System.out.println('Hello, this is non-static method.'); } public static void main(String[] args) { InstanceMethodReference methodReference = new InstanceMethodReference(); // Creating object // Referring non-static method using reference Sayable sayable = methodReference::saySomething; // Calling interface method sayable.say(); // Referring non-static method using anonymous object Sayable sayable2 = new InstanceMethodReference()::saySomething; // You can use anonymous object also // Calling interface method sayable2.say(); } }지금 테스트해보세요
산출:
Hello, this is non-static method. Hello, this is non-static method.
실시예 2
다음 예에서는 인스턴스(비정적) 메서드를 참조합니다. 실행 가능 인터페이스에는 하나의 추상 메소드만 포함됩니다. 따라서 이를 기능적 인터페이스로 사용할 수 있습니다.
public class InstanceMethodReference2 { public void printnMsg(){ System.out.println('Hello, this is instance method'); } public static void main(String[] args) { Thread t2=new Thread(new InstanceMethodReference2()::printnMsg); t2.start(); } }지금 테스트해보세요
산출:
Hello, this is instance method
실시예 3
다음 예에서는 BiFunction 인터페이스를 사용하고 있습니다. 이는 사전 정의된 인터페이스이며 기능적 메소드 apply()를 포함합니다. 여기서는 적용 메소드에 대한 추가 메소드를 참조합니다.
import java.util.function.BiFunction; class Arithmetic{ public int add(int a, int b){ return a+b; } } public class InstanceMethodReference3 { public static void main(String[] args) { BiFunctionadder = new Arithmetic()::add; int result = adder.apply(10, 20); System.out.println(result); } }지금 테스트해보세요
산출:
30
3) 생성자에 대한 참조
new 키워드를 사용하여 생성자를 참조할 수 있습니다. 여기서는 함수형 인터페이스의 도움으로 생성자를 참조합니다.
통사론
ClassName::new
예
interface Messageable{ Message getMessage(String msg); } class Message{ Message(String msg){ System.out.print(msg); } } public class ConstructorReference { public static void main(String[] args) { Messageable hello = Message::new; hello.getMessage('Hello'); } }지금 테스트해보세요
산출:
이진 트리 대 bst
Hello