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

천수병님의 프로필 이미지
천수병

작성한 질문수

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

상품 도메인 개발

ItemRepository 에서 updateItem Method

작성

·

314

·

수정됨

0

안녕하세요.

 

ItemRepository의 해당 업데이트 메서드에서

프로퍼티 값을 수정한, 즉 업데이트 된 findItem을 store에 있는 기존의 item에 덮어쓰지 않았습니다.

 

마킹된 부분은 store에서 아이템을 조회하는 것이므로, findItem은 "자전거",1000,10 상태값을 가지는.. 즉, 업데이트 되지 않은 아이템이 조회되어야 하는 것 아닌가요?

업데이트된 아이템이 조회돼서 질문 드립니다.

답변 1

1

안녕하세요, 천수병 님! 공식 서포터즈 codesweaver 입니다.

모든 프로그래밍 언어에서 파라미터로 넘길 수 있는 값은 두 가지 형태 입니다. '값타입  과 '참조타입’(주소값) 입니다.  

자바에서 값 타입은 int, long, boolean 등, 원시타입이라 하는 모든 타입입니다.

‘참조’는 원시타입을 제외한 모든 객체입니다. 

(WrapperClass 라는 객체이지만 값 타입 처럼 사용하는 특수한 경우도 있습니다)

 

값 타입은 스택영역에 위치합니다. 스택영역에 사용자가 할당한 변수값을 저장합니다.

참조 타입은 스택과 힙 영역을 모두 사용합니다. 사용자가 new 연산자를 이용해 인스턴스를 만들면, 인스턴스 자체는 힙 영역에 저장하고, 힙 영역의 주소값을 스택에 저장합니다.

우리가 참조타입을 사용하면 다음과 같은 과정을 거칩니다.

  • 스택에서 힙 영역의 주소를 알아내고

  • 힙 영역으로 이동(점프)한 뒤 필요한 동작을 수행.

 

메소드를 호출할 때 파라미터를 전달할 수 있는데, 파라미터 전달은 ‘스택 복사’ 작업입니다.

값 타입은 사용자가 입력한 값 자체가 파라미터 변수로 복사 되는반면, 참조 타입은 힙 영역의 주소값을 파라미터 변수로 복사합니다.

그래서, 사용자가 메소드 안에서 값 타입의 내용을 변경하면 외부에 영향을 미치지 않습니다.

반면 참조 타입은 주소값이 복사되었으므로, 결국 같은 인스턴스를 사용합니다. 그래서 메소드 안에서 값을 변경하면 외부에도 영향을 줍니다.

 

콜렉션에 값을 저장하는 것도 마찬가지 입니다. 객체로 저장한 것은 결국 힙 영역에 위치하므로, 인스턴스 내부의 값을 변경하면, 이 인스턴스를 사용하는 모든 범위에 영향을 미칩니다.


감사합니다.

천수병님의 프로필 이미지
천수병

작성한 질문수

질문하기