카테고리 없음

자바의 람다식 메서드 소개와 활용 예(더블콜론) 심화

백봉 2023. 4. 12. 01:05

람다식 메서드는 자바8에서 새로 추가된 기능으로써, 간단하게 말하면 메서드를 하나의 객체로 만들어서 사용하는 것입니다. 이를 통해 코드의 가독성과 간결성을 높일 수 있고, 함수형 프로그래밍을 쉽게 구현할 수 있습니다.

람다식 메서드를 사용하면 기존의 방식과는 조금 다른 형태로 코드를 작성할 수 있습니다. 일반적으로 메서드를 선언하고 사용하는 것과는 달리, 람다식 메서드는 함수형 인터페이스를 구현하는 형태를 가지고 있습니다. 예를 들면 다음과 같습니다.

Function<Integer, Integer> func = (x) -> x * x;
int result = func.apply(5); //25

위의 코드는 정수를 입력값으로 받아 제곱한 값을 반환하는 람다식 메서드를 정의하고 사용하는 예시입니다. 매개변수와 반환값이 있으며, 람다 연산자인 -> 를 사용하여 작성됩니다.

더블콜론(::)을 이용하면, 메서드 참조를 통해 더 간단하게 람다식 메서드를 구현할 수 있습니다. 예를 들어, 다음과 같이 작성할 수 있습니다.

Function<String, Integer> func1 = Integer::parseInt;
int result1 = func1.apply("5"); //5

위의 코드는 String 타입의 값을 Integer로 변환하는 람다식 메서드를 구현하고 사용한 예시입니다. Integer 클래스의 parseInt 메서드를 실제 실행시키는 것이 아니라, 해당 메서드를 참조하여 람다식 메서드를 구현한 것입니다.

더블콜론을 이용한 메서드 참조를 사용하면, 코드를 간결하게 만들 수 있고 가독성도 높아집니다. 또한, 함수형 인터페이스를 구현할 때, 메서드 참조 방식을 이용하면 불필요한 중복을 없앨 수 있습니다.

더블콜론을 이용한 메서드 참조는 일반적으로 다음의 3가지 형태로 사용됩니다.

  • 인스턴스::메서드
  • 클래스::정적메서드
  • 클래스::인스턴스메서드

인스턴스::메서드 형태는 객체 인스턴스의 메서드를 참조할 때 사용됩니다. 예를 들어, 다음과 같은 코드를 작성할 수 있습니다.

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("carrot");

list.stream().forEach(System.out::println);

위의 코드는 List 인스턴스에 저장된 값을 출력하는 예시입니다. forEach 메서드에 인수로 넘겨줄 람다식 메서드를 구현하기 위해 더블콜론을 이용하여 메서드 참조를 사용하였습니다. 이를 통해 forEach 메서드의 실행 결과로 list에 저장된 값이 출력됩니다.

클래스::정적메서드 형태는 객체 인스턴스와 관계없이, 클래스의 정적 메서드를 참조할 때 사용됩니다. 예를 들면 다음과 같습니다.

Function<String, Integer> func1 = Integer::parseInt;
int result1 = func1.apply("5"); //5

Function<String, Double> func2 = Double::parseDouble;
double result2 = func2.apply("3.14"); //3.14

위의 코드는 정수와 실수로 변환하는 람다식 메서드를 각각 Integer 클래스의 parseInt 메서드와 Double 클래스의 parseDouble 메서드를 이용하여 구현한 것입니다. 메서드 참조를 사용하면, 일반적인 방식보다 간결하게 코드를 작성할 수 있습니다.

클래스::인스턴스메서드 형태는 클래스의 인스턴스 메서드를 참조할 때 사용됩니다. 이 때 람다식 메서드에 해당 클래스의 인스턴스가 첫번째 매개변수로 전달되어야 합니다. 예제 코드를 통해 확인해보겠습니다.

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

List<Person> personList = new ArrayList<>();
personList.add(new Person("Tom", 20));
personList.add(new Person("Bob", 30));
personList.add(new Person("Jerry", 40));

personList.stream().map(Person::getName).forEach(System.out::println);

위의 코드는 Person 클래스의 인스턴스를 저장하는 ArrayList를 생성하고, 인스턴스 이름을 출력하는 예시입니다. map 메서드에 인수로 전달하는 람다식 메서드에서는 Person 클래스의 getName 메서드를 참조하여 사용합니다. 이를 통해, personList에 저장된 인스턴스의 이름을 모두 출력할 수 있습니다.

람다식 메서드를 이용한 함수형 프로그래밍은 자바8에서 큰 변화를 가져온 기술 중 하나입니다. 더블콜론을 이용한 메서드 참조를 적극적으로 활용하여, 코드의 가독성과 간결성을 높이고, 유지보수성을 높일 수 있습니다.


이미지