자바 8부터 등장한 람다식은 코드의 간결함을 추구하지만,
때때로 가독성이 떨어질 수 있습니다.
이 문제를 해결하기 위해 메소드 참조(Method Reference)와 생성자 참조(Constructor Reference)가 도입되었습니다.
이번 포스트에서는 메소드 참조와 생성자 참조의 개념과 활용법을 자세히 알아보겠습니다!
✅ 1. 메소드 참조 (Method Reference)
람다식에서 불필요한 매개변수를 제거하여 코드의 가독성을 높이는 기능입니다.
즉, 이미 존재하는 메소드를 람다식에서 직접 참조하여 사용하는 방식입니다.
🎯 1. 메소드 참조의 기본 문법
클래스이름::메소드이름 // 정적 메소드 참조
참조변수::메소드이름 // 인스턴스 메소드 참조
✔ 메소드 참조는 ::(콜론 두 개) 문법을 사용합니다.
✔ 정적 메소드와 인스턴스 메소드에서 다르게 동작합니다.
🎯 2. 정적 메소드 참조 (Static Method Reference)
정적 메소드를 참조할 때는 클래스 이름과 메소드 이름을 :: 연산자로 연결합니다.
✅ 정적 메소드 예제
import java.util.function.BiFunction;
public class MethodReferenceExample {
public static double findMax(double a, double b) {
return Math.max(a, b);
}
public static void main(String[] args) {
// 람다식 방식
BiFunction<Double, Double, Double> lambdaMax = (a, b) -> Math.max(a, b);
// 메소드 참조 방식
BiFunction<Double, Double, Double> referenceMax = Math::max;
System.out.println(lambdaMax.apply(3.5, 7.2)); // 출력: 7.2
System.out.println(referenceMax.apply(3.5, 7.2)); // 출력: 7.2
}
}
✔ Math.max(a, b)는 두 개의 값을 받아 더 큰 값을 반환하는 정적 메소드입니다.
✔ Math::max를 사용하여 불필요한 람다식의 매개변수를 제거하고 더 간결한 코드로 작성했습니다.
🎯 3. 인스턴스 메소드 참조 (Instance Method Reference)
객체(인스턴스)의 메소드를 참조하는 방식입니다.
✅ 인스턴스 메소드 예제
import java.util.function.Function;
public class InstanceMethodReferenceExample {
public String toUpperCase(String str) {
return str.toUpperCase();
}
public static void main(String[] args) {
InstanceMethodReferenceExample example = new InstanceMethodReferenceExample();
// 람다식 방식
Function<String, String> lambdaFunc = (s) -> example.toUpperCase(s);
// 메소드 참조 방식
Function<String, String> referenceFunc = example::toUpperCase;
System.out.println(lambdaFunc.apply("hello")); // 출력: HELLO
System.out.println(referenceFunc.apply("hello")); // 출력: HELLO
}
}
✔ toUpperCase() 메소드는 문자열을 대문자로 변환하는 인스턴스 메소드입니다.
✔ example::toUpperCase를 사용하여 더 간결한 형태로 메소드 참조를 적용했습니다.
🎯 4. 특정 객체의 메소드 참조
일반적으로 두 개의 매개변수가 있는 람다식을 단순화할 때 활용합니다.
✅ 예제
import java.util.Comparator;
public class StringSortExample {
public static void main(String[] args) {
Comparator<String> lambdaComparator = (s1, s2) -> s1.compareToIgnoreCase(s2);
Comparator<String> referenceComparator = String::compareToIgnoreCase;
System.out.println(lambdaComparator.compare("apple", "Banana")); // 출력: -1
System.out.println(referenceComparator.compare("apple", "Banana")); // 출력: -1
}
}
✔ compareToIgnoreCase()는 두 개의 문자열을 비교하는 인스턴스 메소드입니다.
✔ 람다식: (s1, s2) -> s1.compareToIgnoreCase(s2)
✔ 메소드 참조: String::compareToIgnoreCase
✔ 가독성이 훨씬 향상되었습니다.
✅ 2. 생성자 참조 (Constructor Reference)
메소드 참조뿐만 아니라 생성자도 참조할 수 있습니다.
즉, 람다식에서 객체를 생성하는 부분을 단순화할 수 있습니다.
🎯 1. 생성자 참조 기본 문법
클래스이름::new
✔ 클래스 이름과 new를 :: 연산자로 연결하여 사용합니다.
✔ 인터페이스의 추상 메소드 시그니처(매개변수 개수, 타입)에 맞는 생성자가 호출됩니다.
🎯 2. 기본 생성자 참조
✅ 람다식 방식
Supplier<Person> lambdaConstructor = () -> new Person();
✅ 생성자 참조 방식
Supplier<Person> referenceConstructor = Person::new;
✔ 람다식에서 new Person()을 반환하는 것과 동일합니다.
✔ Person::new를 사용하여 더 깔끔하게 표현 가능합니다.
🎯 3. 매개변수가 있는 생성자 참조
생성자에 매개변수가 있는 경우 람다식에서 매개변수를 그대로 전달하는 구조라면 생성자 참조를 사용할 수 있습니다.
✅ 예제
import java.util.function.Function;
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
public class ConstructorReferenceExample {
public static void main(String[] args) {
// 람다식 방식
Function<String, Person> lambdaConstructor = (name) -> new Person(name);
// 생성자 참조 방식
Function<String, Person> referenceConstructor = Person::new;
Person p1 = lambdaConstructor.apply("Alice");
Person p2 = referenceConstructor.apply("Bob");
System.out.println(p1.name); // 출력: Alice
System.out.println(p2.name); // 출력: Bob
}
}
✔ 람다식: (name) -> new Person(name)
✔ 생성자 참조: Person::new
✔ 매개변수를 받아 그대로 전달하는 형태라면 생성자 참조를 적용 가능
🎯 메소드 참조 vs 람다식 비교 정리
유형 | 람다식 방식 | 메소드 참조 방식 |
정적 메소드 | (a, b) -> Math.max(a, b) | Math::max |
인스턴스 메소드 | (s) -> s.toUpperCase() | String::toUpperCase |
특정 객체의 메소드 | (a, b) -> a.compareToIgnoreCase(b) | String::compareToIgnoreCase |
기본 생성자 | () -> new Person() | Person::new |
매개변수 있는 생성자 | (name) -> new Person(name) | Person::new |
🎯 결론
✔ 메소드 참조는 람다식을 더 간결하고 가독성 좋게 만들어주는 기능입니다.
✔ 생성자 참조는 객체를 생성할 때 불필요한 표현을 줄이고 직관적으로 작성할 수 있도록 도와줍니다.
✔ 매개변수의 개수와 순서를 그대로 전달하는 경우에만 사용 가능하다는 점을 주의해야 합니다.
참조:
이것이 자바다 _ 신용권
'Web Programming Language > JAVA' 카테고리의 다른 글
스트림(Stream) 활용 - 리소스로부터 스트림 얻기, 요소 걸러내기(필터링), 요소 변환(매핑) (0) | 2025.03.06 |
---|---|
스트림(Stream) - 스트림, 내부 반복자, 중간 처리와 최종 처리 (0) | 2025.03.06 |
람다식(Lambda Expression) - 매개변수가 없는 람다식, 매개변수가 있는 람다식, 리턴값이 있는 람다식 (0) | 2025.03.05 |
람다식(Lambda Expression)이란? (0) | 2025.03.05 |
MurmurHash3 (1) | 2025.02.17 |