JAVA)this 키워드와 this()메서드

Daehwan Jung·2022년 9월 25일
1

JAVA

목록 보기
1/15

this 키워드

내부 객체 참조 변수명인 this 키워드

모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 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.를 생략해도 컴파일러가 항상 추가해주면 굳이 신경 쓸 필요가 없어 보이는데 왜 배워야할까?

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

this() 메서드

클래스 내 다른 생성자를 호출하는 this()메서드

this()메서드 문법적 규칙

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);
       }
       
}
       

실행결과

첫 번째 생성자

첫 번째 생성자
두 번째 생성자

0개의 댓글