작성
·
314
·
수정됨
답변 1
1
안녕하세요, 천수병 님! 공식 서포터즈 codesweaver 입니다.
모든 프로그래밍 언어에서 파라미터로 넘길 수 있는 값은 두 가지 형태 입니다. '값타입 과 '참조타입’(주소값) 입니다.
자바에서 값 타입은 int, long, boolean 등, 원시타입이라 하는 모든 타입입니다.
‘참조’는 원시타입을 제외한 모든 객체입니다.
(WrapperClass 라는 객체이지만 값 타입 처럼 사용하는 특수한 경우도 있습니다)
값 타입은 스택영역에 위치합니다. 스택영역에 사용자가 할당한 변수값을 저장합니다.
참조 타입은 스택과 힙 영역을 모두 사용합니다. 사용자가 new 연산자를 이용해 인스턴스를 만들면, 인스턴스 자체는 힙 영역에 저장하고, 힙 영역의 주소값을 스택에 저장합니다.
우리가 참조타입을 사용하면 다음과 같은 과정을 거칩니다.
스택에서 힙 영역의 주소를 알아내고
힙 영역으로 이동(점프)한 뒤 필요한 동작을 수행.
메소드를 호출할 때 파라미터를 전달할 수 있는데, 파라미터 전달은 ‘스택 복사’ 작업입니다.
값 타입은 사용자가 입력한 값 자체가 파라미터 변수로 복사 되는반면, 참조 타입은 힙 영역의 주소값을 파라미터 변수로 복사합니다.
그래서, 사용자가 메소드 안에서 값 타입의 내용을 변경하면 외부에 영향을 미치지 않습니다.
반면 참조 타입은 주소값이 복사되었으므로, 결국 같은 인스턴스를 사용합니다. 그래서 메소드 안에서 값을 변경하면 외부에도 영향을 줍니다.
콜렉션에 값을 저장하는 것도 마찬가지 입니다. 객체로 저장한 것은 결국 힙 영역에 위치하므로, 인스턴스 내부의 값을 변경하면, 이 인스턴스를 사용하는 모든 범위에 영향을 미칩니다.
감사합니다.