0Pricing
Java Academy · 강의

임의 인스턴스 메서드 참조

수신 객체를 지정하지 않고 인스턴스 메서드를 참조합니다. 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 정적 메서드 참조
  2. 특정 인스턴스의 인스턴스 메서드 참조
  3. 임의 인스턴스 메서드 참조
  4. 생성자 참조
← Java Academy(으)로 돌아가기