inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍

메서드 참조1 - 시작

인스턴스 메소드 참조와 람다의 차이

180

한재현

작성한 질문수 7

1

강의 수강 중 궁금하여 실험한 내용 공유합니다. 2번 특정 객체의 인스턴스 참조에 관련한 내용입니다.

강의자료에서는 () -> person.introduceperson::introduce와 동일한 것처럼 설명된 것 같습니다. "그럼 person에 대한 캡처가 일어날까?" 하는 궁금증이 들었고, 다음과 같은 코드를 작성했습니다.

Person person = new Person("Kim");
Supplier<String> instanceMethod = () -> person.introduce();
person = new Person("Lee");
System.out.println(instanceMethod1.get());

컴파일러가 person이 사실상 final이 아니라면서 컴파일해주지 않더군요. 다음으로는 람다 대신 메소드 참조로 바꾸어보았습니다.

Person person = new Person("Kim");
Supplier<String> instanceMethod = person::introduce;
person = new Person("Lee");
System.out.println(instanceMethod.get());

이는 컴파일에 성공하고, "I am Kim"이 출력됩니다.

Person 클래스에 setName을 추가하고 메소드 참조 이후에 호출해보았습니다.

Person person = new Person("Kim");
Supplier<String> instanceMethod = person::introduce;
person.setName("Park");
person = new Person("Lee");
System.out.println(instanceMethod.get());

"I am Park"이 출력됩니다.

 

요약하면 다음과 같습니다.

java 함수형-프로그래밍 lambda

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 한재현님.

인스턴스 메소드 참조와 람다 표현식의 차이에 대해 실험을 통해 알아보신 점 잘 정리해주셨네요! 공유해주신 결과는 람다와 메소드 참조의 특성을 이해하는 데 큰 도움이 됩니다.

설명: 람다 식인 () -> person.introduce()는 람다 내부에서 사용되는 변수 person이 사실상 final이어야 합니다. 이는 람다에서 외부 변수의 값을 캡쳐할 때 변경되지 않도록 보장하기 때문입니다. 반면, 메소드 참조인 person::introduce는 변수 person이 더 이상 바뀔 수 있습니다. 이 경우, 메소드 참조는 정의 시점의 person 객체를 참조하여, 이후 해당 객체의 상태 변화를 반영하게 됩니다.

결과 실험:
1. person = new Person("Lee"); 코드에서 람다 식이 컴파일되지 않는 이유는 person이 사실상 final이 아니기 때문입니다. 그러나 메소드 참조는 정의된 객체 상태를 유지하도록 합니다.
2. person.setName("Park"); 다음 출력이 “I am Park”인 이유는, 메소드 참조가 정의 당시의 객체 person을 가리키고 있고, 그 객체의 상태가 변화되었기 때문입니다.

이 차이점은 자바 프로그래밍에서 상태관리를 이해할 때 많이 활용됩니다. 메소드 참조가 더 유연하게 사용될 수 있는 상황을 이해하는 데도 도움이 됩니다.

추가적으로 아래의 링크에서 관련 내용을 확인해 보실 수 있습니다:
- 인스턴스 메소드 참조와 람다 식의 차이점 관련 질문들

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

db sql vs java stream 비교 궁금증 알려주세요!

1

75

1

파라미터 구분이 안되는지..?

0

70

1

자바 21 버전을 꼭 써야하나요??

0

144

2

9. 스트림 API3-컬렉터 오타?

0

78

2

(추석 챌린지) 복습 정리내용

0

95

1

람다 궁금한 점

0

73

2

스트림과 for문 질문

0

44

1

디폴트 메서드를 사용한 리펙토링

0

52

1

실무에서의 커스텀 Collector 사례 여부

0

65

1

IntelliJ 한글 깨지는 현상 문의

0

202

1

함수형 프로그래밍 적용 범위/원칙

0

61

1

스트림에 대해서 질문(float)은 사용하는지

0

58

1

[자료 패키지 누락] 2.람다 자료에서 문제 패키지명 생략 (25page)

0

60

2

지연 평가

0

68

1

메서드 시그니처

0

102

3

고급편 우선순위

0

130

3

스프링 데이터 JPA 인터페이스에서의 default 메서드 사용

0

113

2

독립적인 스레드 할당 시 스레드 개수는 어떻게 할당해야 할까요?

0

87

1

병렬 프레임 병목 현상 해결책에 대해 궁금한 점

0

103

1

스트림 중복 에러 관련 질문

0

71

1

자바 버전이 31 까지 업데이트 된다면 새로운 자바 강의를 추가 하실 건가요?

0

134

1

임계값과 스레드수를 줄일 경우 교착상태가 발생할수 있는건가요?

0

103

2

변수 합치기에 대해서 질문드립니다!

0

83

2

flatMap 응용 방법에 대해서, 이렇게 하는게 맞는지?

0

129

1