728x90
반응형
this
this 키워드
- 자신의 인스턴스를 가리키는 목적으로 사용됨
- 객체(인스턴스) 생성 시 참조변수 this 에 자동으로 인스턴스 주소가 저장됨
레퍼런스 this
- 자신의 인스턴스 주소가 저장되는 참조 변수
- 모든 인스턴스에 자동으로 생성되는 변수이며 객체(인스턴스) 생성 시 자동으로 자신의 인스턴스 주소가 저장됨
- 인스턴스변수와 로컬변수의 이름이 같을 때, 로컬변수가 선언된 메서드 내에서 인스턴스변수를 가리키는 용도
- 메서드 내에서 인스턴스변수와 이름이 중복되는 변수가 없으면 레퍼런스 this 를 생략할 수 있다.
기본 사용 문법
this.인스턴스변수 또는 this.인스턴스메서드()
class Person3 {
String name;
int age;
public Person3(String name, int age) {
// 매개변수로 int형 로컬변수 name, age 선언
// => 로컬변수와 멤버변수(인스턴스변수)의 이름이 같을 때
// 로컬변수가 선언된 메서드 내에서 해당 이름을 지정하면
// 로컬변수를 가리키게 된다!
// name = name; // 로컬변수의 데이터를 다시 로컬변수(자신)에 저장
// age = age; // 따라서, 아무런 효과가 없는 코드가 된다!
// => The assignment to variable name has no effect 경고 발생
// 멤버변수와 로컬변수의 이름이 같을 때 멤버변수를 지정하기 위해서
// 레퍼런스 this 를 사용하여 멤버변수를 지정해야한다!
// => 일반 참조변수와 동일하게 사용하되
// 자신의 인스턴스 주소가 무조건 저장되어 있음
// => 인스턴스를 생성할 때마다 각 인스턴스의 주소가
// 각 인스턴스 내의 this 에 저장되므로 각각 다른 주소를 갖게됨
this.name = name; // 인스턴스변수 name 에 로컬변수 name 값 저장
this.age = age; // 인스턴스변수 age 에 로컬변수 age 값 저장
}
// Getter/Setter 정의
// Getter 메서드는 로컬변수 선언이 없는 경우가 많으므로
// 인스턴스변수에 레퍼런스 this 를 생략해도 된다!
public String getName() {
return name;
}
// Setter 메서드도 인스턴스변수와 로컬변수 이름이 동일하므로
// 인스턴스변수(좌변)에 레퍼런스 this 를 사용한다!
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person3 p = new Person3("홍길동", 20);
System.out.println("이름 : " + p.name);
System.out.println("나이 : " + p.age);
Person3 p2 = new Person3("이순신", 44);
System.out.println("이름 : " + p2.name);
System.out.println("나이 : " + p2.age);
생성자 this()
생성자 내에서 자신의 인스턴스 내의 다른 생성자를 호출
- 생성자 초기화 코드가 중복될 때 중복 제거를 위해 하나의 생성자에서만 초기화 코드를 작성하고 나머지 다른 생성자는 해당 생성자 호출을 통해 데이터만 전달하여 초기화 코드의 중복을 제거하는 용도로 사용
주의사항! 생성자 this() 는 반드시 생성자 내의 첫문장에서 호출되어야한다
기본 사용 문법
this([생성자에 전달할 데이터...]);
class Person4 {
String name;
int age;
// 기본 생성자 정의 - 이름 : "홍길동", 나이 : 0 초기화
public Person4() {
// name = "홍길동";
// age = 0;
// 다른 생성자 Person4(String, int)를 호출하여 대신 초기화 요청
// => 생성자는 new 이외에 직접 호출이 불가능하며 생성자 this() 필수!
this("홍길동", 0);
System.out.println("Person4() 생성자 호출됨!");
// this("홍길동", 0); // 컴파일에러 발생!
// => 생성자 this() 는 반드시 생성자 내의 첫문장에서 호출되어야한다!
}
// 이름 전달받는 생성자 정의 - 나이 : 0 초기화
public Person4(String name) {
// this.name = name;
// age = 0;
this(name, 0); // 로컬변수 name 에 저장된 데이터는 그대로 전달
System.out.println("Person4(String) 생성자 호출됨!");
}
// 이름, 나이 전달받는 생성자 정의
public Person4(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Person4(String, int) 생성자 호출됨!");
}
Person4 p = new Person4();
System.out.println("이름 : " + p.name);
System.out.println("나이 : " + p.age);
Person4 p2 = new Person4("이순신");
System.out.println("이름 : " + p2.name);
System.out.println("나이 : " + p2.age);
728x90
반응형
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] 자바의 참조형변환 (레퍼런스 형변환) (0) | 2021.01.19 |
---|---|
[JAVA] 자바의 final (0) | 2021.01.19 |
[JAVA] 자바의 상속 Inheritance (0) | 2021.01.18 |
[JAVA] 자바의 패키지 Package (0) | 2021.01.18 |
[JAVA] 자바의 생성자 Constructor (0) | 2021.01.18 |