Java/기본

[Java] 메서드 참조

댕주 2024. 10. 27. 16:33

메서드 참조의 유형

1. 정적 메서드 참조

형식: ClassName::staticMethod

 

2. 인스턴스 메서드 참조

 

2-1. 특정 객체

형식: instance::methodName

- 특정 객체의 인스턴스 메서드를 참조한다

- 메서드 참조에서 instance는 이미 생성된 특정 객체를 의미한다

- 이 경우, 참조된 메서드는 주로 인수를 받지 않거나, 받더라도 객체 내부의 상태를 직접 조작할 때 사용된다.

Class Pasta {
	void cook(String sauce) {
    	// 로직
    }
}

public class Main {
	public static void main(String[] args) {
    	Pasta pasta = new Pasta();
        List<String> sauce = Arrays.asList("Cream", "Tomato");
        
        // 람다
        sauce.forEach(s -> pasta.cook(s));
        
        // 특정 객체의 인스턴스 메서드 참조
        sauce.forEach(pasta::cook);
    }
}

여기서 pasta::cook 은 Pasta 객체의 cook 메서드를 참조하는 방식으로, forEach 메서드가 sauce 리스트의 각 요소를 cook 메서드의 인수로 넘겨 호출한다.

=> 이 방식은 메서드를 실행할 구체적인 객체가 미리 정의되어 있을 때 사용한다.

 

- 정적 메서드 참조와 임의 객체 인스턴스 메서드 참조의 유사점

1) 구조: ClassName::methodName 형식을 사용해 특정 클래스의 메서드를 참조한다

2) 인수 처리 방식: list.sort(ClassName::methodName); 같은 방식으로, 두 개 이상의 인수를 처리할 때 마치 정적 메서드 호출하듯이 처리한다

3) 의도와 사용 목적: 두 방식 모두 각 객체나 요소에 대해 동일한 작업을 수행할 때 유용하다

import java.util.Arrays;
import java.util.List;

public class Main {
	public static void main(String[] args) {
    	List<Integer> numbers = Arrays.asList(100, 20, 12);
        
        // 정적 메서드 참조
        numbers.forEach(Main::minus); // Main 클래스에 정적 메서드 minus가 있다고 가정
        
        // 임의 객체 인스턴스 메서드 참조 사용
        numbers.sort(Integer::compareTo);
    }
    
    public static void minus(Integer number) {
    	// 연산
    }
}

Main::minus 는 정적 메서드 참조를 사용하고 있고, Integer::compareTo 는 임의 객체의 인스턴스 메서드 참조이다.

- 정적 메서드 참조 : minus 메서드가 Main 클래스에서 static 으로 선언된 메서드를 참조하는 방식

- 임의 객체의 인스턴스 메서드 참조 : 리스트의 각 요소가 compareTo 메서드를 호출하는 방식으로, 내부적으로 정적 메서드처럼 동작

 

2-2. 임의 객체

형식: ClassName::instanceMethod

- 이 유형은 특정 객체가 아닌 클래스의 인스턴스 메서드를 참조한다

- 메서드가 호출될 때, 리스트나 컬렉션의 각 요소가 메서드의 주체가 되는 객체가 된다.

- 참조된 메서드는 각각의 객체에 대해 동일하게 적용된다.

import java.util.Arrays;
import java.util.List;

public class Main {
	public static void main(String[] args) {
    	List<String> fruit = Arrays.asList("Apple", "Banana", "Cherry");
        
        // 람다
        fruit.sort((c1, c2) -> c1.compareToIgnoreCase(c2));
        
        // 임의 객체의 인스턴스 메서드 참조
        fruit.sort(String::compareToIgnoreCase);
    }
}

여기서 String::compareToIgnoreCase 는 String 클래스의 compareToIgnoreCase 메서드를 참조하며, 각 String 객체가 메서드를 호출하도록 한다. sort 메서드는 fruit 리스트의 각 요소에 대해 이 메서드를 적용해 정렬한다.

=> 이 방식은 주로 컬렉션의 각 요소가 동일한 작업을 수행해야 할 때 유용하다

 

특정 객체의 인스턴스 메서드 참조 : 특정한 객체의 메서드를 직접 호출할 때 사용

임의 객체의 인스턴스 메서드 참조 : 컬렉션이나 리스트의 각 요소가 참조된 메서드를 호출하도록 할 때 사용

 

3. 생성자 참조

형식: ClassName::new