본문 바로가기
Java, JSP

[Java/자바] 메소드 참조(method reference), "::" 사용법

by LasBe 2022. 1. 27.
반응형

⚡️ 메소드 참조(method reference)


람다식을 사용할 때 ::(더블 콜론)을 이용해 메소드를 실행시는 경우가 있습니다.

이러한 문법을 메소드 참조라고 하며 람다식에서 불필요한 매개변수를 제거하는 것이 목적입니다.

람다식에서 기존 메소드를 단순하게 호출만 하는 경우에
메소드 참조를 사용하면 불필요한 매개변수를 제거하고 '::' 기호를 사용하여 표현할 수 있습니다.

그럼 상황별로 메소드 참조 사용법을 알아보겠습니다.


📌 정적(static) 메소드와 instance 메소드 참조

우선 문자열 2개를 함께 출력하는 Chain 클래스 안에 정적 메소드와 인스턴스 메소드 2개를 선언하였습니다.

class Chain{ 
	public static void staticChain(String s1, String s2) { 
    		System.out.println(s1+", "+s2); 
    	} 
    	public void instanceChain(String s1, String s2) { 
    		System.out.println(s1+", "+s2); 
    	} 
}


함수적 인터페이스인 Consumer를 이용해 추상 메소드를
정적 메소드와 인스턴스 메소드 각각 람다식과 메소드 참조로 구현했습니다.

// 정적(static) 메소드 참조 
BiConsumer<String, String> consumer; 
consumer= (s1,s2) -> Chain.staticChain(s1,s2); // 람다식 
consumer = Chain::staticChain; // 메소드 참조 
consumer.accept("static", "method"); 

Chain chain = new Chain(); 

// instance 메소드 참조 
consumer = (s1,s2) -> chain.instanceChain(s1,s2); // 람다식 
consumer = chain::instanceChain; //메소드 참조 
consumer.accept("instance", "method");

함수적 인터페이스에 대한 자세한 내용은 아래를 참고해주세요.

 

[Java/자바] 함수적 인터페이스 java.util.function

함수적 인터페이스 자바 8부터 java.util.function 표준 API로 함수적 인터페이스가 제공되기 시작했습니다. 2022.01.20 - [Language/Java] - [Java/자바] 람다식(Lambda Expression), 함수형 인터페이스 사용법..

lasbe.tistory.com


📌 매개 변수의 메소드 참조

b를 매개 변수로 넣어 a의 인스턴스 메소드 사용하는 경우에도 메소드 참조가 가능합니다.

(a, b) -> {a.instanceMethod(b)} 
a의 클래스::instanceMethod


이번에는 Bifunction을 사용해서 두 문자열이 동일한지 판별하는 예시입니다.

equals() 메소드의 클래스가 String이기 때문에 String::equals로 메소드 참조를 해주었습니다.

BiFunction<String, String, Boolean> function; 

function = (s1, s2) -> s1.equals(s2); // 람다식 
function = String::equals; // 메소드 참조 

Boolean equal = function.apply("서울", "뉴욕"); // false

📌 생성자 참조

메소드 뿐만 아니라 생성자 또한 메소드 참조 방식으로 아래와 같이 사용이 가능합니다.

(a, b) -> {return new 클래스(a,b);} 
클래스::new


이름과 전공을 멤버 변수로 갖는 학생 클래스를 선언해 주겠습니다.

생성자를 통해 학생의 이름과 전공이 매개 변수로 입력됩니다.

class Student{ 
	String name, major; 
        Student(String name, String major){ 
            this.name = name; this.major = major; 
        } 
}


만약 여러개의 생성자가 오버로딩되어 있다면,
컴파일러가 알아서 추상 메소드 매개변수 타입과 개수가 같은 생성자를 찾아 실행시켜줍니다.

BiFunction<String, String, Student> constructor; 

constructor = (name, major) -> new Student(name, major); // 람다식 
constructor = Student::new; // 메소드 참조 

constructor.apply("장성우", "컴공");

📌 Stream에서의 메소드 참조

사실 메소드 참조는 람다식을 사용할 일이 많은 stream에서 많이 찾아볼 수 있습니다.

그럼 스트림에서 메소드 참조가 어떻게 쓰이는지 간단하게 알아보고 글을 마치겠습니다.

List<String> list = List.of("A","AB","ABC","ABCD"); 

// 람다식 사용 
list.stream() 
	.map(str -> str.length()) 
	.forEach(str -> System.out.println(str)); 

// 메소드 참조 사용 
list.stream() 
	.map(String::length) 
	.forEach(System.out::println);

 

더보기

자바 람다식, :: 사용법, 메소드 참조 사용법, 람다식 :: , stream 메소드 참조, stream ::, 스트림 :: 사용법

반응형

댓글


오픈 채팅