본문 바로가기

프로그래밍언어/JAVA

[JAVA] 메서드 참조 (::)

반응형

1. 자바 메서드 참조 (Java Method Reference)

 

자바 메서드 참조는 자바 8 버전부터 지원해주는 기능으로 람다식에서 메서드를 참조하여 사용하여 보다 간단하게 표현할 수 있도록 해준다.

 

사용 방법은 '::' 기호를 사용하여 [클래스명]::[메서드명] 과 같이 사용한다. 스태틱 메서드의 경우 인스턴스 대신 클래스 이름으로 사용할 수 있다.

 

 

2. 메서드 참조 형식

 

메서드 참조는 사용하는 패턴에 따라 다음의 3가지로 구분된다.

 

- static method reference
- instance method reference
- constructor reference

 

- static method reference

 

static method reference는 클래스의 static method 를 메서드 참조로 사용하는 케이스이다. [클래스명]::[메서드명] 의 패턴으로 사용된다.

 

interface FunctionalInterface {
    void printVal(String val);
}

public class StaticReference {
    public static void printSomething(String val) {
	    System.out.println(val);
    }

    public static void main(String[] args) {
        FunctionalInterface ft = StaticReference::printSomething;
        ft.pirntVal("Hello"); // Hello
    }
}

 

위의 예제에서 MethodReference 클래스의 static 메서드인 printSomething 을 메서드 참조 방식으로 사용하여 함수형 인터페이스인 FunctionalInterface ft 가 참조하도록 하였다.

 

- instance method reference

 

instance method reference 는 클래스의 static 메서드가 아닌 객체의 메서드를 메서드 참조로 사용하는 케이스를 의미한다.

 

public class InstanceReference {
    String name;

    public InstanceReference(String name) {
	    this.name = name;
    }

    public void printName() {
    	System.out.println(this.name);
    }
}

public static void main(String args[]) {
    List<InstanceReference> list = Arrays.asList(new InstanceReference("a"), new InstanceReference("b"), new InstanceReference("c"));
    list.stream().forEach(InstanceReference::printName);
}
/*
a
b
c
*/

 

forEach 문에서 InstanceReference 의 객체들이 전달되기 때문에 해당 객체들의 클래스 타입인 InstanceRefernce 와 참조할 메서드 printName 을 사용하여 InstanceRefernce::printName 으로 표현하여 객체의 메서드를 호출한다.

 

- constructor method reference

 

constructor method reference 는 클래스의 생성자를 참조하는 것으로 new 키워드를 사용하여 [클래스명]::new 의 형식으로 사용한다.

 

public class ConstructorReference {
    String name;

    public ConstructorReference(String name) {
	    this.name = name;
    }

    public void printName() {
    	System.out.println(this.name);
    }
}

public static void main(String args[]} {
    List<String> names = Arrays.asList("a", "b", "c");
    names.stream()
	    .map(ConstructorReference::new)
    	.forEach(ConstructorReference::printName);
}
/*
a
b
c
*/

 

map 메서드에서 ConstructorReference::new 를 통해 생성자를 참조하여 사용한다. 이를 통해서 각 String 요소들이 ConstructorReference 객체로 변환된다. 이들을 forEach 문에서 출력하도록 한다.

 

[reference]

 

Java8 - 메소드 레퍼런스(Method Reference) 이해하기

메소드 레퍼런스(Method Reference)는 Lambda 표현식을 더 간단하게 표현하는 방법입니다. 메소드 레퍼런스는 사용하는 패턴에 따라 다음과 같이 분류할 수 있습니다. Static 메소드 레퍼런스, Instance 메

codechacha.com

 

Java 8 Method Reference - javatpoint

Java 8 Method Reference Tutorial with examples and topics on functional interface, anonymous class, lambda for list, lambda for comparable, default methods, method reference, java date and time, java nashorn, java optional, stream, filter etc.

www.javatpoint.com

 

반응형