해결된 질문
작성
·
92
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
안녕하세요.
세션13 - '필드 탐색과 값 변경' 복습을 하다가 의문점이 생겨서 질문을 드립니다.
영한 님이 리플렉션을 이용해서 name의 filed 값을 변경 하는 것을 보고 'final로 변경하면 안되겠지.'라는 생각을 하게 되었습니다.
그래서 userTest를 만들어서 name을 final로 변경해 보고 실험해보았습니다.(당연히 예외 터질 것을 예상 하고요)
근데 왠걸? 저의 예상과는 다르게 결과가 나오는 것을 보고, "......" 밖에 말이 안나 옵니다.
이게 코드 결과입니다.
왜 이렇게 나오는지 설명해 주실 수 있으신가요?
(내용 수정)
답변 부탁 드립니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
생각하는자님, 리플렉션을 이용한 필드의 값 변경에 대해 질문해 주셨네요.
리플렉션을 통해 private
및 final
필드의 접근 및 변경이 가능합니다. 하지만 원래 final
필드는 한 번 초기화되면 그 값을 변경할 수 없도록 되어 있습니다. 리플렉션을 사용할 때, final
필드의 경우에는 주의사항이 있습니다. 리플렉션을 이용해 final
필드의 값을 변경하면, 실제로 그 필드의 값이 변경될 수도 있지만, 이는 보장된 동작이 아닙니다. 특히, JIT 컴파일러의 최적화나 다른 런타임 환경에 따라 다른 동작을 보일 수 있습니다.
또한, 자바의 경우 String과 같은 불변 객체는 메모리에서 참조하는 방식으로 인해 변경이 어렵습니다. 그러나 특정한 환경에서는 예외적인 결과가 나올 수 있습니다.
기본적으로, 리플렉션은 코드 테스트나 런타임에 제한적인 사용을 목적으로 합니다. 예제에서는 리플렉션을 통해 name
필드의 값을 변경하는 흐름을 점검해 보는 실험이었던 것 같습니다. 이상한 결과가 나왔다면, 그 이유는 런타임 환경이나 JIT 최적화로 인해 발생할 수 있는 상황일 것입니다.
아래에 Spring Boot Hot Swapping에 대한 링크를 제공해드립니다.
Spring Boot를 사용 중이라면, 클래스를 재로딩하여 오류를 방지하는 데 도움이 될 수 있습니다.
관련 자료도 함께 확인해 보시길 추천드립니다.
더 궁금한 점이 있다면 언제든지 질문해 주세요!
일단 알수 있는 것은, 리플레션 을 통해서 private랑 final 값이 변경할 수 있다는 점과, 리플렉션을 완전히 잘못 사용하면 아주 위험한 코드가 된다는 거네요. 그리고 링크 봤는데 무슨 내용인지 모르겠네요..