본문 바로가기

Java/문법

7-4장 this 키워드와 this() 메서드

- 클래스의 외부에서 멤버 호출 -> 객체를 먼저 생성한 후 '참조 변수명. 멤버명'의 형태로 호출

- 클래스의 내부에서 멤버 호출 -> 객체의 생성 없이 필드와 메서드 바로 사용 가능 

- But 모든 사용할 수 있는 상태의 멤버는 항상 객체 속에만 존재

 

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

 

 - 모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 this라는 참조 변수가 있음 

 - 모든 멤버는 객체 속에 존재하는 것이므로 int m =3이라는 필드를 클래스 내부에서 출력하고자 할 때도 

   System.out.println(this.m)과 같이 작성해야함

 - this.를 생략하면 컴파일러가 자동으로 this.를 추가해줌

 

 - 묵시적 this 키워드 자동 추가 

package createobject;

//클래스 내부에서 필드, 메서드 앞에 자동으로 붙는 this키워드 
class A {
	int m;
	int n;
	void init(int a, int b) {
		int c;
		c=3;
		this.m=a; //this.를 생략했을 때 자동으로 추가 
		this.n=b; //this.를 생략했을 때 자동으로 추가 
	}
	void work() {
		this.init(2,3); //this.를 생략했을 때 자동으로 추가 
	}
}
public class this_1 {
	public static void main(String[] args) {
		//클래스 객체 생성
		A a = new A();
		//메서드 호출/ 필드값 활용
		a.work();
		System.out.println(a.m);
		System.out.println(a.n);
	}

}

 - init() 메서드에서 넘겨받은 a,b값을 필드 m와 n의 값에 대입

 - work()메서드에서는 init() 메서드를 호출 

 - 클래스 내부에서 멤버인 필드와 메서드를 호출할 때 실제로는 this.m, this.n, this.init() 같이 표현 해야함

 - this.를 생략했을 때 자동으로 추가

 - 모든 멤버는 활용할 때 소속과 함께 표기( 참조변수명. 멤버명)

 - 클래스 내부에서 멤버를 활용할 때 소속을 표기하지 않으면, 컴파일러가 자동으로 소속(this.)를 붙여줌

 

 - 명시적 this 키워드 추가 

package createobject;

class A {
	int m;
	int n;
	void init(int m, int n) {
		m=m;
		n=n;
	}
}
class B {
	int m;
	int n;
	void init(int m, int n) {
		this.m = m;
		this.n = n;
	}
}
public class this_2 {
	public static void main(String[] args) {
		//필드명과 지역 변수명이 같고, this 키워드를 사용하지 않음
		A a = new A();
		a.init(2,3);
		System.out.println(a.m); //0
		System.out.println(a.n); //0
		
		B b = new B();
		b.init(2,3);
		System.out.println(b.m); //2
		System.out.println(b.n); //3
	}
}

 

class A {
	int m;
	int n;
	void init(int m, int n) {
		m=m;
		n=n;
	}
}

 - 필드명 m,n 

  -> 클래스 내부에 선언, 클래스 전체에서 사용가능

 

 - init(int m, int n) 메서드 지역 변수 m, n

  -> init() 메서드 내부에서만 사용 

  -> 필드 m,n과 지역변수 m,n을 모두 사용가능

 

 - 지역 변수와 필드를 모두 사용할 수 있는 영역에서 필드 m,n은 사용 범위가 좁은 변수, 즉 지역변수로 인식

 - init() 메서드 안에서 m=m, n=n은 컴파일러가 모두 지역 변수로 인식하므로 this. 키워드 자동으로 추가되지 않음

 - 지역 변수에 지역 변숫값을 다시 대입하는 형태로 필드값에는 전혀 변화가 없음 

 

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

 

- this() 메서드 

  -  자신이 속한 클래스 내부의 다른 생성자를 호출하는 명령

  - 규칙 1. 생성자의 내부에서만 사용할 수 있다 -> 생성자의 내부에서만 또 다른 생성자를 호출할 수 있다.

  - 규칙 2. 생성자의 첫줄에 위치해야 한다.

 

 - this() 메서드의 문법적 특징과 의미

 

package createobject;

//클래스 정의 
class A {
	A() {
		System.out.println("첫 번째 생성자");
	}
	A(int a) {
		this(); 
		System.out.println("두 번째 생성자");
	}
	/*
	 * void abc() {
	 * 	this();
	 * } // 메서드에서는 this() 메서드 사용 불가능 
	 */
}

public class this_3 {
	public static void main(String[] args) {
		//객체 생성
		A al = new A(); //첫번째 생성자 호출
		System.out.println();
		A a2 = new A(3); //두번째 생성자 호출 (생성자 내부에서 첫번째 생성자 호출)
		
	}
}

 

 - A() 

  - 기본생성자 

  - A a1 = new A() 객체 생성시 첫번째 생성자 호출

   -> "첫번째 생성자"라는 문자열 출력

 

 - A(int a) 

  - A a2 = new A() 객체 생성시 두번째 생성자 호출  

   -> 첫번째 명령 this(). 자신의 또다른 생성자인 A()를 호출

   -> 첫 번째 생성자가 호출된 후 나머지 코드 실행

   -> "첫 번째 생성자"와 "두 번째 생성자" 모두 출력

 

 - this(생성자 입력매개변수) 활용

package createobject;

class A {
	int m1,m2,m3,m4;
	A() {
		m1 = 1;
		m2 = 2;
		m3 = 3;
		m4 = 4;
	}
	A(int a) {
		m1 = a;
		m2 = 2;
		m3 = 3;
		m4 = 4;
	}
	A(int a, int b) {
		m1 = a;
		m2 = b;
		m3 = 3;
		m4 = 4;
	}
	void print() { // 클래스 A의 모든 필드값을 출력
		System.out.print(m1 +" ");
		System.out.print(m2 +" ");
		System.out.print(m3 +" ");
		System.out.print(m4);
		System.out.println();
	}
}

class B {
	int m1,m2,m3,m4; 
	B() {
		m1 = 1;
		m2 = 2;
		m3 = 3;
		m4 = 4;
	}
	B(int a) {
		this(); //B() 생성자 호출
		m1 =a;
	}
	B(int a, int b) {
		this(a); //B(int a) 생성자 호출
		m2 = b;
	}
	void print() { //클래스 B의 모든 필드값을 출력
		System.out.print(m1 +" ");
		System.out.print(m2 +" ");
		System.out.print(m3 +" ");
		System.out.print(m4);
		System.out.println();
	}
	
}
public class this_3 {
	public static void main(String[] args) {
		//3가지 객체 생성(this() 미사용)
		A a1 = new A();
		A a2 = new A(10);
		A a3 = new A(10,20);
		a1.print();
		a2.print();
		a3.print();
		System.out.println();
		
		//3가지 객체 생성(this() 사용)
		B b1 = new B();
		B b2 = new B(10);
		B b3 = new B(10,20);
		b1.print();
		b2.print();
		b3.print();
		
	}
}

'Java > 문법' 카테고리의 다른 글

8-2 장 외부 클래스  (0) 2023.04.24
8-1장 패키지와 임포트  (0) 2023.04.24
7-3장 생성자  (0) 2023.04.24
7-2장 메서드  (0) 2023.04.24
7-1장 필드  (0) 2023.04.24