메서드 참조의 유형
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
'Java > 기본' 카테고리의 다른 글
[Java] Java에서 final로 진짜_최종_최종_최종 불변 객체 만들기 (0) | 2024.10.31 |
---|---|
[Java] Java에서 final로 불변 객체 만들기 (0) | 2024.10.30 |
[Java] 스트림(Stream) (0) | 2024.10.27 |
[Java] 표준 함수형 인터페이스 (0) | 2024.10.27 |
[Java] 추상 클래스 (0) | 2024.10.27 |