임의 인스턴스 메서드 참조
수신 객체를 지정하지 않고 인스턴스 메서드를 참조합니다. Stream 연산에서 널리 사용됩니다.
임의 인스턴스 메서드 참조은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
임의 인스턴스 참조란 무엇인가요
임의 인스턴스 메서드 참조는 ClassName::instanceMethod를 사용합니다. 여기서는 함수형 인터페이스의 첫 번째 인수가 수신 객체 역할을 하므로 각 요소가 메서드가 호출되는 객체가 됩니다.
import java.util.*;
import java.util.stream.*;
List<String> names = List.of("alice","bob","carol");
// String::toUpperCase — receiver is each list element
List<String> upper = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upper); // [ALICE, BOB, CAROL]수신 객체가 결정되는 방식
임의 인스턴스 참조 Type::method에서는 함수형 인터페이스의 첫 번째 매개변수가 this(수신 객체)가 됩니다:
// String::length matches Function<String, Integer>
// Equivalent to: s -> s.length()
Function<String, Integer> len = String::length;
System.out.println(len.apply("Java")); // 4
// String::isEmpty matches Predicate<String>
// Equivalent to: s -> s.isEmpty()
Predicate<String> isEmpty = String::isEmpty;
System.out.println(isEmpty.test("")); // true스트림 연산에서 빈번하게 사용
임의 인스턴스 참조는 스트림 파이프라인에서 가장 흔히 사용되는 형식입니다:
List<String> words = List.of("Hello","","World","","Java");
// filter with String::isEmpty
long empty = words.stream().filter(String::isEmpty).count();
System.out.println(empty); // 2
// map with String::toLowerCase
words.stream()
.filter(s -> !s.isEmpty())
.map(String::toLowerCase)
.forEach(System.out::println);두 인수 메서드와 함께 사용하는 BiFunction 형식
형식의 두 인수 메서드는 수신 객체가 T이고 인수가 U인 BiFunction<T, U, R>와 일치합니다:
import java.util.function.*;
// String::startsWith → BiPredicate<String, String>
// receiver=first arg, argument=second arg
BiPredicate<String, String> starts = String::startsWith;
System.out.println(starts.test("JavaStream", "Java")); // true
System.out.println(starts.test("Python", "Java")); // false임의 인스턴스와 Comparator 사용
String::compareTo는 Comparator<String>과 일치하며, 비교기의 두 인수는 각각 수신 객체와 매개변수가 됩니다:
List<String> words = List.of("banana","apple","cherry");
List<String> sorted = words.stream()
.sorted(String::compareTo)
.collect(Collectors.toList());
System.out.println(sorted); // [apple, banana, cherry]사용자 정의 클래스의 임의 인스턴스
JDK 형식뿐 아니라 모든 클래스의 인스턴스 메서드에서도 사용할 수 있습니다:
record Product(String name, double price) {
boolean isExpensive() { return price > 50; }
String label() { return name + " ($" + price + ")"; }
}
List<Product> products = List.of(
new Product("Widget", 9.99),
new Product("Gadget", 99.99),
new Product("Donut", 1.50)
);
products.stream()
.filter(Product::isExpensive)
.map(Product::label)
.forEach(System.out::println); // Gadget ($99.99)특정 인스턴스와의 차이
핵심적인 차이점은 다음과 같습니다:
- 특정:
obj::method— obj가 항상 수신 객체입니다 - 임의:
Type::method— 각 요소가 수신 객체 IS입니다
String fixed = "prefix";
// Specific instance: fixed is always the receiver
Predicate<String> startsFixed = fixed::startsWith; // always checks 'prefix'.startsWith(arg)
// Arbitrary instance: each element is the receiver
Predicate<String> isEmpty = String::isEmpty; // each element.isEmpty()Collectors에서 메서드 참조 사용
임의 인스턴스 참조는 컬렉터와 자연스럽게 결합됩니다:
List<String> items = List.of(" hello "," world "," java ");
List<String> trimmed = items.stream()
.map(String::trim)
.collect(Collectors.toList());
System.out.println(trimmed); // [hello, world, java]메서드 참조 연결
메서드 참조는 Function의 andThen/compose와 연결할 수 있습니다:
Function<String, String> pipeline =
((Function<String, String>) String::trim)
.andThen(String::toUpperCase);
System.out.println(pipeline.apply(" hello world "));
// HELLO WORLD주의할 점: 오버로드된 메서드
메서드가 오버로드되어 있으면 컴파일러가 함수형 인터페이스와 일치하는 오버로드를 추론해야 합니다. 모호한 경우 컴파일 오류가 발생하므로 람다를 사용하여 명확하게 지정하세요:
// println is overloaded — which one?
// Consumer<String> c = System.out::println; // OK — infers println(String)
// Consumer<Object> c2 = System.out::println; // OK
// But if ambiguous:
// Function<Object,?> fn = System.out::println; // Error — println doesn't return a value성능
메서드 참조와 람다는 동일한 바이트코드로 컴파일됩니다(동적 호출을 통해). 성능 차이는 없으므로 더 읽기 쉬운 쪽을 선택하세요. 의도를 명확하게 표현할 수 있다면 대부분의 스타일 가이드에서는 메서드 참조를 선호합니다.
빠른 확인
.map()과 함께 사용할 때 String::toUpperCase는 무엇을 나타내나요?
복습: 임의 인스턴스 메서드 참조
핵심 내용:
- 구문: ClassName::instanceMethod — 각 요소가 수신 객체입니다
- 수신 객체가 첫 번째 매개변수인 함수형 인터페이스와 일치합니다
- .map(), .filter(), .sorted(), .forEach()에서 가장 흔히 사용됩니다
- 두 인수 메서드 → 요소를 수신 객체로 사용하는 BiFunction/BiPredicate
- 람다와 성능 차이가 없으므로 가독성을 기준으로 선택하세요
자주 묻는 질문
“임의 인스턴스 메서드 참조” 강의는 무료인가요?
네 — “임의 인스턴스 메서드 참조” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“임의 인스턴스 메서드 참조”에서 뭘 배우나요?
수신 객체를 지정하지 않고 인스턴스 메서드를 참조합니다. Stream 연산에서 널리 사용됩니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“임의 인스턴스 메서드 참조” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 정적 메서드 참조
- 특정 인스턴스의 인스턴스 메서드 참조
- 임의 인스턴스 메서드 참조
- 생성자 참조