인스턴스 메소드 참조와 람다의 차이
180
작성한 질문수 7
강의 수강 중 궁금하여 실험한 내용 공유합니다. 2번 특정 객체의 인스턴스 참조에 관련한 내용입니다.
강의자료에서는 () -> person.introduce가 person::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"이 출력됩니다.
요약하면 다음과 같습니다.
() -> person.introduce에서는person이 사실상 final이 되어야만 한다.person::introduce는 사실상 final이 아니어도 되며, 해당 메소드 참조는 정의 시 객체 참조를 유지한다.
답변 1
0
안녕하세요, 인프런 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





