인프런 커뮤니티 질문&답변

truepine님의 프로필 이미지
truepine

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

회원 관리 웹 애플리케이션 요구사항

MemberRepository 클래스의 findAll 함수 질문입니다.

해결된 질문

작성

·

387

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
findAll() 함수를 설명하실 때 store의 변조를 보호하기 위해 새로운 ArrayList 에 담아서 반환한다고 하셨는데, 이 말이 store.values() 를 그대로 반환하면 CallByReference로 반환되어서 외부에서 List의 값을 변경하면 store의 value도 변경된다는 말씀이신건가요??

그리고 새로운 ArrayList 에 담아서 반환해도 store 자체에 접근하면 값이 변경될 수도 있다고 하셨는데, MemberRepository 에서 store는 private로 선언되어있는데 어떻게 store 의 value 를 변경할 수 있는건지 궁금합니다.

답변 1

1

안녕하세요, truepine 님. 공식 서포터즈 y2gcoder 입니다.

findAll() 함수를 설명하실 때 store의 변조를 보호하기 위해 새로운 ArrayList 에 담아서 반환한다고 하셨는데, 이 말이 store.values() 를 그대로 반환하면 CallByReference로 반환되어서 외부에서 List의 값을 변경하면 store의 value도 변경된다는 말씀이신건가요??

맞습니다. store.values()를 그대로 반환하게 되면 반환된 List 객체와 store 객체 내부의 값이 동일한 메모리 참조를 갖게 되기 때문에 외부에서 List의 값을 변경하면 store의 value도 변경되는 문제가 발생할 수 있습니다.

 

그리고 새로운 ArrayList 에 담아서 반환해도 store 자체에 접근하면 값이 변경될 수도 있다고 하셨는데, MemberRepository 에서 store는 private로 선언되어있는데 어떻게 store 의 value 를 변경할 수 있는건지 궁금합니다.

말씀하신 부분은 어디쯤인지 찾아주시면 제가 문맥을 이해하고 답변을 드리는데 더 수월할 것 같습니다. 6분 경에 말씀하신 것처럼 store에 있는 멤버 객체를 가져와서 수정하면 수정된다고 말씀하신 부분은 찾았습니다. 해당 부분에서 말씀하신 것을 예시 코드와 연관지어 말씀드려보자면, findById()로 가져온 member 객체는 store에 저장된 객체와 동일한 메모리 참조를 가지고 있기 때문에 member 객체를 수정하면 store에 있는 해당 객체의 값도 변경되어버리는 것을 말씀해주신 것 같습니다:)



감사합니다.

truepine님의 프로필 이미지
truepine
질문자

이해되었습니다! store의 member 객체를 직접 가져와서( findById() 로 가져와서) 수정하면 findAll() 을 새로운 ArrayList 에 담아서 반환한다고 해도 수정이 되는게 당연히 맞는 말인데, 제가 직접 가져온다는 말에 대한 이해가 느렸네요. 감사합니다!

파이팅입니다!

truepine님의 프로필 이미지
truepine

작성한 질문수

질문하기