자바 객체 참조 전달 void 메서드 값 변경 이유 오류 해결 예제 코드
자바를 공부하다 보면 void 메서드는 값을 반환하지 않는데, 메서드 안에서 객체 값을 바꿨더니 원본 객체까지 변경되는 상황을 자주 만나게 됩니다. 처음 보면 “자바가 객체를 참조 전달하는 건가?”라고 생각하기 쉽습니다. 하지만 정확히 말하면 자바는 객체 자체를 참조 전달하는 언어가 아니라, 객체를 가리키는 참조값을 복사해서 전달 합니다. 쉽게 말하면 메서드 안의 매개변수와 메서드 밖의 변수가 같은 객체를 바라보고 있기 때문에, 그 객체의 내부 값을 바꾸면 양쪽에서 변경된 결과가 보입니다. 자바 객체 참조 전달 개념 먼저 정리하기 🔉 1. 자바는 참조 전달이 아니라 값 전달 방식입니다 결론부터 보면, 자바의 메서드 호출은 기본형이든 참조형이든 모두 값 전달 방식으로 이해해야 합니다. 여기서 많이 헷갈리는 부분은 객체 변수에 저장된 값이 객체 자체가 아니라는 점입니다. 객체 변수에는 실제 객체가 통째로 들어 있는 것이 아니라, 힙 메모리에 있는 객체를 찾아갈 수 있는 참조값이 들어 있습니다. Java Language Specification은 메서드가 호출될 때 각 매개변수마다 새로운 변수(parameter variable)가 만들어지고, 그 변수는 호출 시 전달된 인자 값으로 초기화된다고 설명합니다. 즉, 메서드 안의 매개변수는 바깥 변수와 같은 변수가 아니라 새로 만들어진 변수입니다. 🔉 2. 객체 값이 바뀌는 이유는 같은 객체를 바라보기 때문입니다 void 메서드에서 객체 값이 바뀌는 이유는 반환값 때문이 아니라, 메서드 안에서 같은 객체의 필드나 상태를 수정했기 때문입니다. 예를 들어 User user 라는 변수가 있고, 이 변수를 changeName(user) 에 전달했다고 가정해보겠습니다. 이때 user 변수 자체가 넘어가는 것이 아니라, user 안에 들어 있던 참조값이 복사되어 메서드의 매개변수로 들어갑니다. 하지만 복사된 참조값도 같은 객체를 가리킵니다. 그래서 메서드 안에서 user.name = "Kim...