본문 바로가기

BackEnd/Java

this, 자신을 가리키는 예약어

<< 객체를 참조할 때 사용하는 this >>

생성자 또는 메서드 내에서 로컬변수와 멤버변수의 이름이 같을 때 멤버변수를 지정하기 위한 키워드로 사용 된다

객체에 대한 레퍼런스(참조값)이기 때문에 객체가 생성되기 전에는 사용할 수 없다
따라서 static 영역에서는 this 키워드를 사용할 수 없다

 


기본 문법

 

this.멤버변수


this를 사용하지 않았을 때

 

class Person4 {
	String name; // 멤버변수

	public Person4(String name) { // 로컬변수
		name = name;
	}
}


클래스 내에서 사용한 name이라는 로컬변수의 영향이 더 크기 때문에
로컬변수 name에 로컬변수 name을 저장한다는 의미라 경고가 발생한다 (의미없는 일이기 때문)

 

 

this를 사용했을 때

 

class Person4 {
	String name; // 멤버변수

	public Person4(String name) { // 로컬변수
		this.name = name;
	}
}

 

위 처럼 this.name은 멤버변수(String name)를 가리키게 된다.

 

<< 다른 생성자를 호출하는 this >>

생성자 내에서 자신의 또 다른 생성자를 호출하는 키워드
'레퍼런스 this'와 동일하게 자신의 인스턴스에 접근하여 다른 생성자를 호출할 때 사용

생성자 오버로딩 시 멤버변수 초기화 코드의 중복을 제거하기 위해 사용한다

(여러 생성자에서 멤버변수를 중복으로 초기화하지 않고 하나의 생성자에서만 초기화하고 나머지 생성자에서는 해당 생성자를 호출하여 초기화 할 값만 전달 후 대신 초기화 수행)

생성자 내에서 다른 코드보다 뒤 쪽에 this()가 올 수 없음 (다른 코드가 먼저 실행될 수 없음)

 


기본 문법

 

this([파라미터...])


아래 코드의 주석을 해석해보자

 

public static void main(String[] args) {
	// 1900/1/1 출력
	MyDate d1 = new MyDate();
	System.out.println(d1.year + "/" + d1.month + "/" + d1.day);
	
	// 2020/1/1 출력
	MyDate d2 = new MyDate(2020);
	System.out.println(d2.year + "/" + d2.month + "/" + d2.day);
	
	// 2020/2/1 출력
	MyDate d3 = new MyDate(2020, 2);
	System.out.println(d3.year + "/" + d3.month + "/" + d3.day);
	
	// 2020/2/11 출력
	MyDate d4 = new MyDate(2020, 2, 11);
	System.out.println(d4.year + "/" + d4.month + "/" + d4.day);
}

class MyDate {
	int year;
	int month;
	int day;
	
	public MyDate() {
		// System.out.println(); -- 생성자 내에서 다른 코드보다 뒤 쪽에 this() 가 올 수 없다
		this(1900, 1, 1);
	}
	public MyDate(int year) {
		this(year, 1, 1); // year 파라미터만 입력받고 month, day는 1로 고정된 데이터만 저장
	}
	public MyDate(int year, int month) {
		this(year, month, 1); // year, month 파라미터만 입력받고 day는 1로 고정된 데이터만 저장
	}
	
	// 모든 파라미터(year, month, day)를 입력받고 다른 생성자에서 호출되면 직접적으로 일을 하는 메서드
	public MyDate(int year, int month, int day) {
		System.out.println("MyDate(int, int, int) 생성자 호출!");
		
		this.year = year;
		this.month = month;
		this.day = day;
	}
}