[JAVA] 자바 this 키워드와 this() 메서드

    728x90

    안녕하세요

    로로봉입니다 : )

    오늘은 this키워드와 this() 메서드에 대해 알아보겠습니다.


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

    클래스의 외부에서 멤버를 호출하기 위해서는 객체를 먼저 생성한 후 참조 변수명.멤버명의 형태로 호출하지만

    클래스 내부에서는 객체의 생성 없이 필드와 메서드를 바로 사용할 수 있었습니다.

    그 이유는 모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 this라는 참조 변수가 있기 때문입니다.

    클래스 내부에서 필드와 메서드를 그대로 사용하게 되면 컴파일러가 자동으로 this. 를 추가해주어 컴파일하여 참조 변수명 없이 바로 사용할 수 있는 것입니다.

    this.를 생략해도 항상 컴파일러가 추가해 주기때문에 굳이 신경 쓸 필요가 없어 보이지만, 그렇지 않습니다.

    this.를 명시적으로 붙여줘야 할 때가 있기 때문입니다.

    class Test {
       int a;
       int b;
       void init(int a, int b) {
          a = a;
          b = b;
       }
    }

     위와 같이 필드명과 메서드의 지역변수명이 동일한 경우 컴파일러는 a = a; 를 지역 변수로 인식하기 때문에 this. 를 추가하지 않게 됩니다.

    Test t = new Test();
    t.init(3, 4);
    System.out.println(t.a);	// 0
    System.out.println(t.b);	// 0

    init 메서드를 통해 필드 a와 b에 3과 4를 넣는 코드였을 테지만, 실제 init 메서드는 지역변수 a와 b에 본인의 값을 다시 넣는 구조가 됩니다.

    필드 a와 b의 값은 전혀 변화가 없게 됩니다. 실제 필드 a, b에 대입하기 위해선 다음과 같이 this를 명시적으로 붙여주어야 합니다.

    class Test {
       int a;
       int b;
       void init(int a, int b) {
          this.a = a;
          this.b = b;
       }
    }
    
    Test t = new Test();
    t.init(3, 4);
    System.out.println(t.a);	// 3
    System.out.println(t.b);	// 4

    자바에서는 제공하는 대부분의 API가 메서드의 지역 변수명과 필드명이 동일하게 구성되어 있기 때문에 this.에 대해 꼭 잘 이해하여야 합니다.



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

    이번에는 this() 메서드에 대해 알아보겠습니다. this 키워드와 매우 비슷하게 생겼지만, 의미는 전혀 다릅니다.

    this()메서드는 자신이 속한 클래스 내부의 다른 생성자를 호출하는 명령입니다. 

    앞서 생성자에 대해 알아볼 때 입력 매개변수의 자료형이나 개수에 따라 생성자가 여러개 구성될 수 있음을 배웠었습니다.

    그러한 생성자를 클래스 내부에서 호출하는 메서드가 this() 메서드라고 합니다.

    this() 메서드를 사용할 때는 반드시 2가지를 지켜주어야 합니다.

    첫 번째, 생성자의 내부에서만 사용할 수 있습니다.

    두 번째, 생성자의 첫 줄에 위치해야 합니다.

    이 두가지를 지켜주어야 this() 메서드를 사용할 수 있습니다.

    class Test {
       Test() {
          System.out.println("첫 번째 생성자");
       }
       
       Test(int a) {
          this();
          
          System.out.println("두 번째 생성자");
       }
    }
    
    public class JavaTest {
       public static void main(String[] args) {
          Test t1 = new Test();
          System.out.println();
          Test t2 = new Test(3);
       }
    }
    
    
    
    /// 실행 결과 ///
    첫 번째 생성자
    
    첫 번째 생성자
    두 번째 생성자

    실행 결과를 보면 t1 객체가 만들어 지면서 첫 번째 생성자가 호출되었고, t2 객체가 만들어지면서 두 번째 생성자가 실행되지만 두 번째 생성자에서는 첫 번째 생성자를 호출하고 시작하기 때문에 첫 번째 생성자가 다시 실행 후 두 번째 생성자가 실행되는 것을 볼 수 있습니다.

    생성자에서는 가장 주요 목적이 필드의 초기화에 있습니다. 이런 this() 메서드를 통해 여러 생성자에서도 동일한 필드 초기화를 처리할 수 있게 됩니다.

    매번 일일이 필드를 초기화 해준다면 비효율 적일 것 입니다. 그렇기 때문에 this() 메서드가 필요하다고 볼 수 있습니다.

     

    좋아요 ♥ + 구독 부탁드립니다 : )

    728x90
    반응형

    댓글