logo

Java 메소드 참조

Java는 Java 8에서 메소드 참조라는 새로운 기능을 제공합니다. 메소드 참조는 기능적 인터페이스의 메소드를 참조하는 데 사용됩니다. 람다 표현의 간결하고 쉬운 형태입니다. 메서드를 참조하기 위해 람다 식을 사용할 때마다 람다 식을 메서드 참조로 바꿀 수 있습니다. 이번 튜토리얼에서는 메소드 참조 개념을 자세히 설명하고 있습니다.


메소드 참조 유형

Java에는 다음과 같은 유형의 메소드 참조가 있습니다.

  1. 정적 메서드에 대한 참조입니다.
  2. 인스턴스 메서드에 대한 참조입니다.
  3. 생성자에 대한 참조입니다.
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