[Java] 참조변수(a.k.a 인스턴스)

백승하·2021년 10월 12일
0

Java

목록 보기
8/8
@Test
public void save() {
	Member member = new Member();
	member.setName("spring");
    
    	repository.save(member);
        
        Member result = repository.findById(member.getId()).get();
        assertThat(result).isEqualTo(member);
   
}

인프런 영한님의 "스프링입문 - 코드로 배우는 스프링 부트..." 강의를 듣다가 잘 이해가 안되는 부분이 생겨서 찾아보게 된 참조변수이다.
위의 코드가 진행되는 과정을 설명해보면,


1. @Test 어노테이션을 통해 Test코드가 동작하고,
2. save() 라는 메소드의 기능을 테스트 하고,
3. Member class의 객체인 member를 정의하고,
4. member의 name항목에 "spring"을 밀어 넣는다.
5. repository에 member 객체를 저장하고
6. repository에서 getId 메소드를 통해 member의 Id를 찾아서 result에 저장한다.
7. 그리고 result 객체와 member 객체를 비교해서 참인지 거짓인지 판단한다.


이처럼 아주 자연스럽게 흘러가던 중 6번이 뭔가 이상했다. 파이썬 문법에 익숙한 내 입장에서는 Member라는 class가 result앞에 와야 하는 이유에 대해서 이해가 가지 않았다.

debug라는 아주 훌륭한 기능을 통해 member객체와 result 객체에 저장돼있는 id, name을 확인해봤다.
그 결과, 놀랍게도 result에는 name을 지정한 적이 없지만, member와 같은 값인 "spring"이 저장돼있었다.

여기서 "참조변수"라는 개념이 나오게 된다.

프로그래밍을 하면서 어려움을 겪을 때마다 믿고 찾아보는 생활코딩의 자바 강좌에 아주 훌륭한 비유가 있어 조심스레 가져와봤다.

"참조변수는 윈도우에서 흔히 볼 수 있는 바로가기와 같아서 진짜 값이 저장돼 있는 것이 아니라 경로를 가리키고 있는 것"

자바에서 초기화를 할 때 int, String 같은 자료형으로 초기화를 할 수도 있지만, class 명으로 초기화를 할 수도 있고, 이럴 때에는 변수의 개념보다 객체의 개념으로 초기화되고, 이렇게 초기화된 객체는 단순히 본래 값의 경로를 가리키고 있기 때문에 복제와 달리 추가적으로 용량을 사용하지도 않고, 초기화된 어느 객체를 통해서도 수정이 가능하다.


이를 위의 예제 코드에 적용해보면,
처음에 member라는 객체는 Member라는 class를 가리키고 있고, member.setName("string")이라는 코드를 통해 name = "string"이라는 값을 가지게 된다. 이 때 Member의 name도 "string"으로 변하게 되기 때문에 이후에 result라는 객체로 초기화했을 때, result의 name 도 "string"이라는 값을 그대로 가지게 된다.

profile
꿈꾸고 실현하는 개발자

0개의 댓글