[JAVA] 자바 this
지난 생성자 포스팅에서 this()라는 메서드를 조금 살펴봤었는데요. 이번에는 예약어 this에 대해서 알아보도록 하겠습니다. 먼저 간단한 예제를 하나 살펴보도록 하겠습니다.
위와 같은 간단한 프로그램이 있다고 했을때 실행을 시켜보면 aaa.disp()와
bbb.disp()는 각각x=10, y=20 과 x=5, y=6을 출력하게 되는데요. 이 결과가
어찌보면 당연하지만 조금 더 깊게생각해보면 당연하지가 않은 결과 입니다.
먼저 메인메서드에서 aaa와 bbb객체를 만들면서 메모리상에는 두개의 x와 y값이
할당 되어 있게 됩니다. aaa와 bbb에는 모두 x와 y의 값이 있는 상태에서 aaa.disp()
실행의 뜻은 aaa 객체를 통에서 disp()메서드를 호출하라는 뜻인데요.
그러면 Ex04클래스 에서 disp()메서드를 먼저 찾게 될것입니다.
객체를 생성할때 만들어진 x,y는 분명이 메모리상에 두 개씩이 있는데,
JVM이 어떻게 알고 aaa에 대입된 10과 20을 출력하게 되는 것일까요?
여기서 먼저 개념을 잡고 넘어가야 할게 있습니다.
aaa.disp(10,20);
1. 해당 객체를발생시킨 클래스(Ex04) 내부에서 메서드(disp())를 찾는다.
2. 그 메서드가(disp()) static메서드가 아니라면 0번째 매개변수에게 객체를 대입한다.
클래스 내부에 있는 메서드는 static을 제외하고는 모두 0번째 매개변수를 갖고 있습니다.
0번째 매개변수라는 것은 모든 매개변수보다 우선한다는 뜻입니다. 그리고 클래스 내부에
있는 필드는 static필드를 제외하고 모두 this객체의 접근이 생략되어 있습니다.
조금 복잡하지만 예제를 들어가면서 살펴보기로 하겠습니다.
위의 경우 aaa()와 bbb()는 0번째 매개변수를 갖게 됩니다. 하지만 CCC()는 static메서드
이기 때문에 0번째 매개변수를 갖지 않습니다. 이걸 0번째 매개변수와 this객체를 통한
접근을 표시해 표시해보면 에러가 발생하게 됩니다.
0번째 매개변수는 이미 가지고 있기 때문에 사용자가 임으로 사용할 수 없습니다.
그러나 this 객체부분은 적어도 됩니다. 위쪽의 예제에 적용 시켜보면 다음과 같습니다.
위의 예제를 살펴보면 첫번째로 aaa의 객체를 발생시킨 클래스가 Ex04이므로
그 클래스 내부에서 disp()메서드를 찾게됩니다. 그리고 disp()가 static이 아니기
때문에 0번째의 매개변수인 this에게 객체인 aaa를 대입하게 됩니다.
이러한 용도로 사용되는 this는 생량할 수 있습니다. 하지만 꼭 써줘야 하는 경우도
있습니다. 다음 예제를 살펴보도록 하겠습니다.
여기서 [x=x] 부분이 문제가 됩니다. 실제로 매개변수로 사용되는 변수명과 필드명이
동일한 경우 반드시 두개를 구분해 줘야 합니다. 그것을 구분해 주는 것이 바로 자기
자신의 멤버 필드임을 표시하는 this객체 입니다. 따라서 다음과 같이 바꿔줘야 합니다.