java this : 현재 객체를 참조한다.

코딩/Java 2019. 12. 8. 20:27

 인스턴스를 생성했습니다. 예를 들어, MyCar 객체라면 MyCar a = new MyCar(); 이런 식으로 생성했을 거에요. 그러면, 우리는, a.run()과 같은 메소드를 호출할 수 있을 거에요. 그런데, a.run 메서드 안에서, 자기 자신을 참조하려면 어떻게 해야 할까요?

 

 


 영어 시간으로 돌아가 봅시다. 지시 대명사 중에서 this, that. 이런 것들이 있어요. 이 중에 this는 이것 이라는 뜻을 가져요.

 

 

 Mycar a = new MyCar(); 를 호출하면, 힙에 인스턴스 변수들이 생성이 됩니다. 그리고 a는 힙에 생성된 무언가를 가리키고 있을 겁니다. 여기서 차 이름에 맞게 부속품들을 setting 한다고 생각해 봅시다.

 

 이 일을 MyCar 클래스가 다 해버리면 힘들 거에요. 차는 달리고 멈추고 하는 것만으로도 벅찬데, 자기가 자기 차에 대해서 setting을 해야 한다니요. 너무 책임이 많아요. 그러면, 이걸 어떻게 넘길 수 있을까요? Setter (혹은 Producer)에게 차 이름에 맞게끔 차를 셋팅하게 하는 수 밖에 없을 거에요. 그러면, new Setter를 호출할 때, 자기 자신을 넘겨야 할 거에요. 어떻게 하면 될까요?

 

 

 답은 this를 쓰면 된다는 것입니다. 15번째 줄을 보면, new MyCar("Sonata"); 라는 것이 있습니다. 그러면, 객체가 메모리에 생성이 될 거에요.

 

 

 Heap에 새로운 객체가 생성이 되었습니다. 현재 실행 중인 것은 new Car("Sonata") 입니다. 그러면 this는, 새롭게 생성된 MyCar 객체를 가리킬 거에요.

 

 

 이것을 current object라고 할 게요. 그러면, new Setter(this)를 하면 어떻게 될까요? 즉, 8번째 줄을 수행하면? Setter의 생성자는, MyCar의 참조 변수를 매개변수로 받을 거에요. 그러면 이것 또한, 새로 갓 생성된 객체를 가리킬 거에요.

 

 

 

 이런 식으로 받았다면, 메모리에 요렇게 그려질 거에요.

 

 

 그러면 Setter 에서, 새로 생성된 MyCar 객체를 참조 가능할 거에요. 참조 가능하다는 이야기는 적절하게 Setter를 통해서, 새로 생성된 MyCar 인스턴스의 내용을 바꿀 수 있다는 거에요.

 

 


 다른 용례를 봅시다. 현재 실행 중인 current Object를 알아야 할 때가 있습니다. 예를 들자면, 이런 경우입니다.

 

 이런 경우 빈번하게 있을 수 있어요. 그런가요?

 

 이 때 synchronized(this)를 쓸 수 있는데요. 여기에서, synchronized의 의미는 중요하지 않습니다. 다만, 그 대상이 this라는 것이 중요한 점입니다. 예를 들어 공유 객체인 SharedBoard sb가 있습니다. sb.add(...) 이런 것을 T1과 T2가 동시에 호출했다고 해 봅시다. 그러면 sb.add();를 호출해서 SharedBoard 안으로 들어간 순간, current Object는 sb가 됩니다.

 

 

 그러면 우리는 this를 잠그겠다고 하면, 어떤 것을 잠그게 될까요? sb가 가리키는 객체를 잠그겠네요. this는 current Object를 refer 한다는 것만 잘 기억해 두시면 좋겠습니다.

 

 


 한 가지 더 보도록 하겠습니다.

 

 실행 결과는 3이 나올까요? 0이 나올까요? 사실, 저는 3이 나오길 의도했습니다만. 제 이클립스는 그러지 않았습니다. 그랬던 이유는, myObj 생성자를 호출했습니다. 8번째 줄에 x = x; 라고 되어 있어요. 그러면..

 

 

 안쪽에 있는 x에 의해, 바깥에 있는 x가 가려진 상황입니다. 그러면 x에 x값을 넣으면, 어떻게 될까요? 아무런 effect가 없을 거에요. 바깥에 있는, 인스턴스 변수인 x에 값을 대입하기 위해서는 어떻게 해야 할까요? 13번째 줄에서 new MyObj(3);을 호출했을 때, current Object는 새로 생성된 MyObj일 겁니다.

 

 

 만약에 8번째 줄에 this.x = x; 로 바꾸었다고 해 봅시다. 그렇다면, this.x는 새로 생성된 객체의 x라는 필드를 의미할 거에요. 생성자 호출이 끝나면, new MyObj(3); 의 값을 a에 넣습니다. 이 a는 새로 생성된 객체를 의미합니다.

 

 

 

 그러면 this.x는 새로 생성된 MyObj 객체를 의미해요. 그것의 필드 x 값을 의미합니다. 생성자가 끝나면, 새로 생성된 MyObj의 특정한 값을 a에 넣는데요. 이 때, a는 갓 생성된 MyObj 객체를 가리킵니다.

 

 

 

  따라서, 8번째 줄을 this.x = x; 로 바꾸면 a.x의 값은 3이 출력됩니다. 기억해야 할 것은 this는 현재 current object를 가리킨다는 것입니다. 이것만 기억하셔도 크게 문제 없을 듯 싶습니다.