성장일기

[Java] this()와 this

2022. 1. 23. 23:53

자바에서 this()와 this는 같은 키워드를 띄고 있지만 엄연히 다른 문법이다.

 

 

this()

자바에서 같은 클래스의 멤버(변수, 메소드)간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다. 단, 다음의 두 조건을 만족시켜야 한다.

 

  • 생성자의 이름으로 클래스 이름대신 this를 사용해야 한다.
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서 호출해야 한다.

 

다음의 코드는 생성자에서 다른 생성자를 호출하였지만, 두 조건을 만족시키지 못했기 때문에 에러가 발생한다.

Car(String color){
    door = 5;	
    Car(color, "auto", 4);
}

첫번째 조건 : 생성자 내에서 다른 생성자를 호출할 때는 클래스 이름 Car()대신 this()를 사용해야 한다.

두번째 조건 : 생성자 내에서 다른 생성자 호출 시 첫 번째 줄에서 호출해야 한다.

 

 

this()만 사용한 예제 확인

class Car{
    String color;
    String gearType;
    int door;

    Car() {
        this("white");
    }

    Car(String c) {
        this(c, "auto", 4);
    }

    Car(String c, String g, int d) {
        color = c;
        gearType = g;
        door = d;
    }
}

 위의 예제 코드는 같은 클래스 내의 생성자들이 서로 관계가 깊은 경우가 많아서 유기적으로 연결하여 더 좋은 코드를 작성했다. 아래의 코드와 비교해보면 동일한 일을 하지만 위의 코드는 this()를 사용하여 생성자 내에서 다른 생성자를 호출하여 더 보기좋고 간략하게 표현하였다.

 

 이러한 코드의 장점은 수정이 필요한 경우 보다 적은 코드만을 변경하면 되므로 유지보수가 쉬워진다. 하지만 위의 코드에서도 아쉬운 점이 있다. 아쉬운 점은 this를 이용하면 해결된다. 아쉬운점과 this의 사용을 다음장에서 알아보자.

class Car2{
    String color;
    String gearType;
    int door;

    Car2() {
        color = "white";
    }

    Car2(String c) {
        color = "white";
        gearType = "auto";
        door = 4;
    }

    Car2(String c, String g, int d) {
        color = c;
        gearType = g;
        door = d;
    }
}

 

 

this까지 적용

class Car{
    String color;
    String gearType;
    int door;
    
    Car(String c, String g, int d) {
        color = c;
        gearType = g;
        door = d;
    }
}

 this 키워드에만 집중하기 위해 생성자 오버로딩과 this()를 사용하지 않고 하나의 생성자만 두었다. 위 코드에서 아쉬운 점이 무엇일까? 바로 생성자의 매개변수명이다. 생성자는 매개변수로 인스턴스변수들의 초기값을 제공받는 경우가 많기 때문에 매개변수와 인스턴스변수 이름이 일치하는 경우가 대부분이다. 

 

 이때는 아래의 코드와 같이 this를 사용하면 매개변수의 이름과 인스턴스명을 다르게 하는 것보다 this를 사용해서 구별되도록 하는 것이 의미가 더 명확해지고 직관적이다.

class Car{
    String color;
    String gearType;
    int door;

    Car(String color, String gearType, int door) {
        this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

this는 참조변수로 인스턴스 자신을 가리킨다. 참조변수에 인스턴스의 주소정보를 저장하고 해당 인스턴스의 멤버에 접근할 수 있는 것처럼, this로 인스턴스 변수에 접근할 수 있는 것이다. 하지만 this를 사용할 수 있는 것은 인스턴스멤버뿐이다. 

+ 사실 생성자를 포함한 모든 인스턴스메소드에는 자신이 관련된 인스턴스를 가리키는 참조변수 this가 지역변수로 숨겨진 채로 존재하는 것이다.

 

마지막으로 정리하자면

 

  • this(), this(매개변수..) : 같은 클래스의 생성자 내에서 다른 생성자를 호출할 때 사용한다.
  • this : 인스턴스 자신을 가리키는 참조변수로 인스턴스의 주소가 저장되어 있다. 모든 인스턴스 메소드에 지역변수로 숨겨진채 존재한다.

 

간단하게 this()는 생성자이고, this는 참조변수이다.

'Java' 카테고리의 다른 글

[Java] super와 super()  (0) 2022.01.29
[Java] 초기화 블럭(initialization block)  (0) 2022.01.24
[Java] 가변인자(varargs)와 오버로딩  (0) 2022.01.07
[Java] 가변 배열  (0) 2022.01.06
[Java] 커맨드 라인을 통해 입력받기  (0) 2022.01.06

공유하기

facebook twitter kakaoTalk kakaostory naver band