자바 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

 


🎯 결론

메소드 참조람다식을 더 간결하고 가독성 좋게 만들어주는 기능입니다.
생성자 참조객체를 생성할 때 불필요한 표현을 줄이고 직관적으로 작성할 수 있도록 도와줍니다.
매개변수의 개수와 순서를 그대로 전달하는 경우에만 사용 가능하다는 점을 주의해야 합니다.
 
 
 
 
 
 
 

참조:
이것이 자바다 _ 신용권

 
 

+ Recent posts