this란?

this는 Java에서만 사용하는 것이 아니라 C, C++ 등 여러 곳에서 많이 사용됩니다.

여기서 this의 영어를 뜻은 "(가까이 있는 것을 가리켜)이것"이라는 것처럼 this는 객체 자기 자신을 가리킵니다.

this가 많이 사용되는 곳은 매개변수가 있는 생성자, setter 등에서 많이 사용됩니다.

 

예를 들어서 Person이라는 객체가 존재한다고 해보겠습니다.

public class Person {
    String name;
    Integer age;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show() {
        System.out.println("이름 : " + name);
        System.out.println("나이 : " + age);
    }

    public static void main(String[] args) {
        Person noArgPerson = new Person();
        Person oneArgPerson = new Person("hoestory");
        Person allArgPerson = new Person("hoestory", 25);

        noArgPerson.show();
        oneArgPerson.show();
        allArgPerson.show();
    }

}
  • noArgPerson.show() 결과 -> 이름 : null, 나이 : null
  • oneArgPerson.show() 결과 -> 이름 : hoestory, 나이 : null
  • allArgPerson.show() 결과 -> 이름 : hoestory, 나이 : 25

코드를 보면 this로 되어있는 값들이 null 이 아닌 넣은 값 그대로 나옵니다.

this.name = name을 하게 되면 String name에 name 값이 들어가게 되어 null이 아니게 됩니다.

 

※ 참고

Integer age를 한 이유는 null이 나오는 것을 보여드리고 싶어서 Integer로 하였습니다.

Integer는 Wapper class라 null을 허용하고 int는 Primitive 자료형이라 값을 안넣으면 Default값이 0이 나옵니다.

 

 

this를 위 방식과 다른 방식으로 사용할 수 있습니다.

public class Person {
    String name;
    int age;

    public Person() {
        this("hoestory");
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show() {
        System.out.println("이름 : " + name);
        System.out.println("나이 : " + age);
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.show();
    }

}

 

  • this("hoestory")를 하고 person.show()를 할 경우 결과 -> 이름 : hoestory, 나이 : null

매개변수가 있는 생성자를 생성을 안하고 빈 생성자를 인스턴스 화해서 show()라는 메서드를 호출했을 때 원래 같으면 이름도 null이 나와야 되는데 hoestory가 나왔습니다.

그 이유는 this("hoestory")때문입니다. 빈 생성자를 호출해주는 시점에 매개변수가 있는 생성자를 불러서 name값을 넣어서 이름값이 hoestory값이 나오는 겁니다.

 

this(값, 값) 사용 시 주의사항

public class Person {
    String name;
    int age;

    public Person() {
    	this.name = "hoe";
        this.age = 25;
        this("hoestory");
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show() {
        System.out.println("이름 : " + name);
        System.out.println("나이 : " + age);
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.show();
    }

}
  • this("hoestory")를 해주기 전에 아무것도 this()보다 먼저 나오면 안 됩니다. 만약 this()보다 먼저인 게 있다면 오류가 날것입니다.
  • 오류가 나는 이유 :  인스턴스의 생성이 완전하지 않은 상태이므로 오류가 납니다.