- 클래스의 외부에서 멤버 호출 -> 객체를 먼저 생성한 후 '참조 변수명. 멤버명'의 형태로 호출
- 클래스의 내부에서 멤버 호출 -> 객체의 생성 없이 필드와 메서드 바로 사용 가능
- 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 |