본문 바로가기
프로그래밍 언어/Java

[Java] this & this()

by 까망 하르방 2021. 3. 6.
반응형

Java에서 this는 현재 실행되는 메소드가 속한 객체에 대한 레퍼런스

this는 컴파일러에 의해 자동으로 생성되며 개발자는 별도로 this를 선언할 필요 없이 사용하기만 하면됩니다.

public class Person {
    public int age;
    
    public Person(int age) {
        this.age = age;
    }
}

 

현재 위에는 인자의 변수와 멤버 변수의 이름이 동일합니다.

이는 인자의 목적을 그대로 표현하기 위해 이름을 동일하게 사용한 경우입니다.

하지만 이런 경우에는 어느 소속의 age 변수인지 확인할 수 있어야 하기 때문에 this 키워드를 사용.

 

실제 실무에서는 생성자를 작성할 때 다음과 같이 만들어 주는 것이 관례입니다.

public class Shape {

    private char type;
    private int width;
    private int height;
    
    public Shape(char type, int width, int height) {
        this.type = type;
        this.width = width;
        this.height = height;
    }
}

 

굳이 이렇게 번잡한 작업을 하는 이유는 사실 가독성 때문입니다.

parameter와 인스턴스 변수명을 다르게 사용한다면 this 키워드를 사용할 필요가 없겠지만

파라미터가 많아지다보면 객체 안에서 어떻게 사용되지 알 수 없는 일이 발생하기 때문에 

파라미터를 아예 데이터의 이름과 통일 시켜 버리는 겁니다.

(성능관점에서는 위의 방식이 성능에 저해되는 요소가 될 수 있지만 성능보다는 가독성 선택한 경우)

 

 

this vs this()

this와 비슷한 형태로 this()를 사용하기도 합니다.

this()는 한 클래스 내에서 한 생성자에서 다른 생성자를 호출할 때 사용합니다.

 

매개변수가 존재하는 생성자가 기본 생성자를 호출하는 case

public class Person {
    public int age;
    
    public Person() {
        System.out.println("기본 생성자...");
    };
    
    public Person(int age) {
        this();
    }
    
    public static void main(String[] args) {
        Person p = new Person();
    }
}

 

예제

public class Person {
    public int age;
    
    public Person() {
        this(20);
        System.out.println("기본 생성자...");
    };
    
    public Person(int age) {
        System.out.println("매개변수 생성자...");
        this.age = age;
    }
    
    public static void main(String[] args) {
        Person p1 = new Person();
        System.out.println("===");
        Person p2 = new Person(10);
    }
}

이를 통해 기본생성자든 매개변수 생성자로 호출하든 age라는 멤버변수를 강제할 수 있게 되었다.

여기서 한가지 주의할점은 this()는 해당 메소드의 body 영역에서 첫부분에 위치해야 된다는 것이다.

 

[예제]

public class FoodPrice {

    private int menuPrice;
    private int quantity;
    
    public FoodPrice(int menuPrice) {
        this(menuPrice, 1);
        
        // 아래 두 줄이 필요없다!
        // this.menuPrice = menuPrice;
        // this.quantity = 1;
    }
    
    public FoodPrice(int menuPrice, int quantity) {
        this.menuPrice = menuPrice;
        this.quantity = quantity;
    }
    
    public static void main(String[] args) {
        FoodPrice food1 = new FoodPrice(1000);
        FoodPrice food2 = new FoodPrice(1000, 3);
    }
}

중복적인 코드를 최소화할 수 있습니다.

위의 코드는 객체를 생성하는 옵션이 두 가지라는 것을 의미합니다.

- 하나는 그냥 메뉴의 가격만을 넣는 것.

- 또 하나는 메뉴의 가격과 수량을 같이 지정하는 것.

  다만, 메뉴의 가격만을 넣으면 자동으로 메뉴의 수량은 1이 되도록 작성됨

 

요약

- this()는 생성자 코드에서만 사용

  생성자가 아닌 일반 메소드에서 this()를  사용할 수 없다.

  (왜냐하면 생성자 자체는 처음 객체를 생성할 때만 사용된다.)

- this()는 동일한 클래스내의 다른 생성자를 호출할 때 사용

- this()는 반드시 생성자의 첫 번째 위치에서 사용되어야 한다.

 

 

 

반응형

'프로그래밍 언어 > Java' 카테고리의 다른 글

[Java] 형 변환  (0) 2021.03.07
[Java] Class와 Instance (객체 형태)  (0) 2021.03.07
[Java] Java 언어 특징 및 실행과정  (0) 2021.03.04
[Java] Setter vs 생성자  (0) 2021.03.04
[Java] 유효범위  (0) 2021.03.04

댓글