모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 this라는 참조 변수가 있다.
모든 멤버는 객체 속에 존재하는 것이므로 우리가 int m = 3; 이라는 필드를 클래스 내부에서 출력하고자 할 때도 System.out.println(this.m) 과 같이 작성해야 한다.
다만 this.을 생략하면 컴파일러가 자동으로 this.을 추가해 주기 떄문에 지금까지 클래스 내부에서 필드와 메서드를 그대로 사용할 수 있던 것이다.
*지역변수는 멤버가 아니므로 this.가 자동으로 붙지 않는다.
class A{
int m;
int n;
void init(int a, int b){
int c;
c=3;
this.m=a; //this.를 생략했을 떄 자동으로 추가
this.n=b; //this.를 생략했을 떄 자동으로 추가
}
void work(){
this.init(2,3); //this.를 생략했을 떄 자동으로 추가
}
}
this.를 생략해도 컴파일러가 항상 추가해주면 굳이 신경 쓸 필요가 없어 보이는데 왜 배워야할까?
class A{
int m;
int n;
void init(int m, int n){
m=m;
n=n;
}
}
위 예제에서 필드는 m,n이며 init 메서드 에서도 지역 변수 m과 n 이 있다.
의도 : init()메서드에서 입력받은 지역 변수 m과 n의 값을 필드 m과 n에 각각 대입하고자 한다.
먼저 필드와 지역 변수의 사용 범위를 알아보자
필드 : 필드 m,n은 클래스 내부에 선언돼 있으며, 클래스 전체에서 사용할 수 있다.
지역변수: 반면 지역변수 m,n은 init()메서드 내부에서만 사용할 수 있다.
그렇다면 init()메서드 내부에서 m,n을 사용하면 이는 지역 변수일까 필드일까?
지역 변수와 필드 모두를 사용할 수 있는 영역에서는 사용 볌위가 좋은 변수, 즉 지역변수로 인식한다. 따라서 init() 메서드 안에서 m=m; n=n;과 같이 작성하면 컴파일러는 이들 모두를 지역변수로 인식해 this.를 추가하지 않는다.
따라서 다음과 같이 객체를 생성한 후 메서드를 호출하고 필드값을 확인하면 모두 값이 0으로 나온다.
A a= new A();
a.init(3,4);
System.out.println(a.m); //0
System.out.println(a.n); //0
의도한 바와 같이 넘겨받은 지역 변수 m,n의 값을 필드 m,n에 대입하기 위해서는 다음과 같이 코드를 작성하여야 한다.
class B{
int m;
int n;
void init(int m, int n){
this.m=m;
this.n=n;
}
}
// this.m =필드
// m=지역변수
B b = new B();
b.init(3,4);
System.out.println(b.m); //3
System.out.println(b.n); //4
1.생성자의 내부에서만 사용할 수 있다.
2.생성자의 첫 줄에 위치해야 한다.
class A{
A(){
System.out.println("첫 번째 생성자");
}
A(int a){
this();
System.out.println("두 번째 생성자");
}
}
public class ThisMethod_1{
public static void main(String[] args){
A a1 = new A();
System.out.println("");
A a2 = new A(3);
}
}
실행결과
첫 번째 생성자
첫 번째 생성자
두 번째 생성자