JAVA 메소드 참조[ : : ]에 대해서

#JAVA018 #메소드참조 #함수형인터페이스
Jan 06, 2024
JAVA 메소드 참조[ : : ]에 대해서
 

🍒 개요

메소드 참조 (Method Reference)는 Java 8에서 도입된 기능으로, 람다 표현식을 더 간결하게 작성할 수 있게 해주는 구문이다. 메소드 참조는 메소드 자체를 참조하는 것이다. 메소드를 호출하는 것과 혼동하면 안된다. 이 메소드 호출과 참조의 개념이 헷갈릴 수 있으나, 이 메소드 참조는 코드의 간결성과 메소드의 제어권을 사용자에게 부여하므로 더 효과적이라 할 수 있다.
 

🥭 메소드 참조의 기본 구조

메소드 참조는 특정 메소드를 간결하게 참조하는 방법으로, 함수형 인터페이스의 구현체로 사용되어 특정 동작을 수행한다.
메소드 참조의 기본 구조
메소드 참조의 기본 구조
이 메소드 참조의 참조만 한다라는 표현이 조금 어렵다. 때문에 어떤 맥락에서는 메소드가 바로 실행될 때가 있고, 메소드 실행 준비 상태로 호출되기를 기다리는 상황이 생기기 때문이다. 하지만 실제로 메소드가 바로 실행되는 경우라도 메소드 참조는 참조까지만 진행하고 주변의 코드에 의해서 실행되는 것이다.
 
메소드 참조가 주변 코드의 맥락에서 그 라인에서 실행될 때 모
메소드 참조가 주변 코드의 맥락에서 그 라인에서 실행될 때 모
따라서 람다식과 다르게, 이는 코드 구현된 자리에서 실행되는 것이 아니다. 메소드 참조는 참조만 하고 있는 상태이기 때문에, 이것이 실행되기 위해서는 주변 코드의 맥락이 만들어져 있거나, 호출해 주는 메소드가 필요하다. 이 떄문에 사용자에게 더 제어권을 제공해 주게 되는 것이다.
 
 
💡
함수형 인터페이스란?? 함수형 인터페이스란 오직 하나의 추상 메소드를 가진 인터페이스를 말한다. 이는 상태 값을 갖지 않는 순수 함수만 가진 기능메소드라고 생각하면 되고, 이 메소드는 매개변수로서도 전달이 가능하다. 때문에 함수형 인터페이스로 고차원적 함수 설계가 가능하다고 할수 있다. @FunctionalInterface 어노테이션이 붙기도 하는데, 이는 명시적으로 컴파일러에게 해당 메소드를 구현하지 않으면 컴파일 에러가 나므로, 좀 더 명확한 의도를 전달 할 수 있다.
 
 

🏗️기본 문법으로부터의 발전

기본 문법
notion image
자바의 함수형 인터페이스의 메소드를 사용하기 위해서 기본적으로 필요했던 문법이다. 여기서는 Comparator 인터페이스가 익명 클래스로 사용되고 있다.
 
간결화된 문법 (람다식)
notion image
람다식으로 표현하면 좀 더 코드가 간결해 진 것을 확인 할 수 있다.
 
메소드 참조
notion image
메소드 참조를 사용하면 코드가 가장 간결하고 명확해진다. String::compareto 는 String 클래스의 compareTo 메소드를 참조하며, 이 메소드는 두 문자열을 비교하는데 필요한 모든 로직을 포함하고 있다.
 

🍑 메소드 참조의 종류

메소드 참조가 사용되는 상황은 다양하다. 주로 사용되는 4가지 종류를 살펴보자.
 
정적 메소드 참조
notion image
  • 구조 : ClassName :: staticMethodName
  • 여기서 Calculator 클래스의 정적 메소드 add를 참조가 obj변수에 저장 되었다.
  • obj.apply()를 실행하면 Calculator.add(10,20)가 실행되고 그 결과인 ‘30’을 반환한다.
 
 
특정 객체의 인스턴스 메소드 참조 (Bound Instance Method Reference) - 생성된 객체
notion image
  • 구조 : intstace :: instanceMethodName
  • 여기서 System.outPrintStream의 객체이다. 객체가 생성되어있는 메소드메소드 참조형식으로 시그니처가 일치하는 인터페이스의 메소드와 호환되어 사용이 된다.
  • 여기선 Consumer인터페이스의 메소드 accept가 매개변수를 하나 받고 반환 값이 없는 시그니처가 일치하기 떄문에 메소드 참조와 호환이 되었다.
 
 
임의 객체의 인스턴스 메소드 참조 (Unbound Instance Method Reference) - 같은 타입의 객체들
notion image
  • 구조 : Type :: methodName
  • 여기서는 String 클래스의 모든 객체에 대해 length메소드를 호출 할 수 있다. 따라서 Function인터페이스를 구현하고 있는 lengthFunction.applyString.length를 호출할 수 있게 됨으로서 문자열의 길이를 계산하고 출력하게 된다.
 
 
생성자 참조
notion image
  • 구조 : ClassName :: new
  • ArrayList::new는 ArrayList의 기본 생성자를 참조하며, listSupplier.get을 호출하면 새 ArrayList 객체가 생성된다.
 
 
 
 
 
 
Share article
RSSPowered by inblog