[JAVA] this키워드
@욕심쟁이
·2020. 8. 21. 16:56
1. this 키워드
- 자신의 현재 인스턴스 주소가 저장되어 있는 참조변수
(자신의 인스턴스를 가리키는 목적으로 사용됨)
- 객체(인스턴스)생성시 참조변수 this에 자동으로 this에 인스턴스 주소가 저장됨
※ 로컬변수와 멤버변수(인스턴스변수)의 이름이 같을때 로컬변수가 선언된 메서드 내에서
해당 이름을 지정하면 로컬변수를 가르킴 로컬변수의 데이터를 다시 로컬변수(자신)에저장
따라서, 아무효과가 없는 코드가 됨.
name = name; // 로컬변수 = 로컬변수로 읽힌다.
//The assignment to variable name has no effect(이 변수명을 쓰는것은 아무효과가 없다) 노란줄 경고
※ 멤버변수와 로컬변수의 이름이 같을떄 멤버변수를 지정하기 위해서 레퍼런스 this를 사용하여
멤버변수를 지정해야함.
→ 일반 참조변수와 동일하게 사용하되 자신의 인스턴스 주소가 무조건 정장되어있음
→ 인스턴스를 생성할 떄 마다 각인스턴스의 주소가 각인스턴스 내의 this(인스턴스변수 접근)에
저장되므로 각각 다른 주소를 갖게됨
public class Ex {
public static void main(String[] args) {
Person3 p = new Person3("강감찬",20);
System.out.println("이름 : "+ p.name);
System.out.println("나이 : "+ p.age);
Person3 p2 = new Person3("이순신",10);
System.out.println("이름 : "+ p2.name);
System.out.println("나이 : "+ p2.age);
}
}
class Person3{
String name; //멤버변수
int age;
public Person3(String name, int age) { //매개변수로 int형 로컬변수 name, age를 선언
this.name = name; //this를 사용하면 멤버변수를 가르킴
this.age = age;
//인스턴스변수는 new하면 사용가능 멤버변수 접근
//메서드변수는 호출되어야 지역변수로 접근
}
}
2. 레퍼런스 this
- 자신의 인스턴스 주소가 저장되는 참조변수
- 모든 인스턴스에 자동으로 생성되는 변수이며
객체(인스턴스)생성 시 자동으로 자신의 인스턴스 주소가 저장됨
- 인스턴스변수와 로컬변수의 이름이 같을때, 로컬변수가 건언된 메서드 내에서 인스턴스 변수를 가르키는 용도
- 인스턴스 내에서 인스턴스변수와 이름이 중복되는 변수가 없으면 레퍼런스 this를 생략 할 수 있다.
<기본사용문법>
this.인스턴스변수
//또는
this.인스턴스 메서드();
this.model( 인스턴스변수(멤버변수)) = model(로컬변수(매개변수))
3. 다른생성자 호출 : this() (생성자 this)
- 생성자 내에서 자신의 인스턴스 내의 다른 생성자를 호출
- 생성자 초기화 코드가 중복 될 때 중복 제거를 위해 하나의 생성자에서만 초기화 코드를 작성하고
나머지 다른생성자는 해당 생성자 호출을 통해 데이터만 전달하여 초기화 코드릐 중복을 제거하는 용도로 사용
this(로컬(매개)변수[,로컬(매개)변수,.....]);
! 주의사항
생성자 this()는 반드시생성자 내의 첫줄에서 호출되어야한다!
public class Ex4 {
public static void main(String[] args) {
Person4 p = new Person4();
p.print();
Person4 p2 = new Person4("이순신");
p2.print();
Person4 p3 = new Person4("강감찬", 20);
p2.print();
}
}
class Person4{
String name;
int age;
public Person4() {
//name="홍길동";
//age=0;
//다른 생성자 Person4(String ,int)를 호출하여 대신 초기화 요청
//=> 생성자는 new이외에 직접 호출이 불가능하며 생성자 this()필수
this("홍길동", 0);
System.out.println("Person4() 생성자 호출됨!");
//this("홍길동", 0); // 컴파일 에러발생! => 생성자 this()는 반드시생성자 내의 첫문장에서 호출되어야한다!
}
public Person4(String name) {
//this.name=name;
//age=0;
this(name,0);
System.out.println("Person4(String) 생성자 호출됨!");
}
public Person4(String name, int age) {
//this.name = name;
//this.age = age;
this(name,age);
System.out.println("Person4(String, int) 생성자 호출됨!");
}
public void print() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
}
}
/*
<출력결과>
Person4(String, int) 생성자 호출됨!
Person4() 생성자 호출됨!
이름 : 홍길동
나이 : 0
Person4(String, int) 생성자 호출됨!
Person4(String) 생성자 호출됨!
이름 : 이순신
나이 : 0
Person4(String, int) 생성자 호출됨!
이름 : 이순신
나이 : 0
*/
'IT > JAVA' 카테고리의 다른 글
[JAVA] FINAL 키워드 (0) | 2020.09.02 |
---|---|
[JAVA] 상속(Inheritance)[부모(슈퍼)클래스/ 자식(서브)클래스]1 (0) | 2020.08.31 |
[JAVA] 생성자 오버로딩(생성자 다중정의) (0) | 2020.08.21 |
[JAVA] 생성자 필드(멤버변수) 초기화 (0) | 2020.08.21 |
[JAVA] 생성자(Constructor) (0) | 2020.08.21 |