DEV/JAVA
this
devvnn
2021. 12. 18. 12:39
this란?
- 메소드에서 현재 인스턴스를 가리키는 역할
코드로 살펴보기
public class Person {
private String name;
public Person(String pName) {
name = pName;
}
public void sayHello() {
System.out.println("Hi. My name is " + this.name);
}
class Main{
public static void main(String[] args) {
Person p1 = new Person("김여름");
p1.sayHello();
Person p2 = new Person("김가을");
p2.sayHello();
}
}
}
|
cs |
Hi. My name is 김여름
Hi. My name is 김가을
|
cs |
- p1.sayHello();는 sayHello 메소드를 호출, sayHello 메소드가 실행될 때 this는 현재 인스턴스인 p1, p1.name은 "김여름"이기 때문에 위와 같은 출력값이 나옴
- 마찬가지로 p2.sayHello();를 하면 this는 현재 인스턴스인 p2를 가리킴
일반 메소드에서의 사용
public class Person {
String name;
public void setName(String name) {
this.name = neme;
}
}
|
cs |
- this가 없으면 인스턴스 변수 name이 아닌 파라미터를 가리키게 됨
- 해당 위치에서는 인스턴스 변수 name 보다 파라미터 변수 name이 더 가깝기 때문
- 클래스로 생성된 인스턴스 변수 name을 가리키려면 "this"를 사용하면 됨
- 인스턴스 변수와 파라미터 변수를 확실하게 구분할 수 있음
생성자에서의 사용
기존에 작성했던 것
public class BankAccount {
private Person owner;
...
public BankAccount(Person pOwner) {
owner = pOwner;
}
...
}
|
cs |
this를 넣기
public class BankAccount {
private Person owner;
...
public BankAccount(Person owner) {
this.owner = owner;
}
...
}
|
그렇다면 BankAccount의 인스턴스를 Person 인스턴스에 넣어주는 것은 어떻게 할 수 있을까?
// 3.BankAccount의 2번 생성자를 사용해서 인스턴스 a1을 만듭니다.
// 파라미터로 p1을 넘겨줘서 p1과 a1을 연결해줍니다.
// 생성 후 잔액을 100000으로 재설정해줍니다.
BankAccount a1 = new BankAccount(p1);
a1.setBalance(100000);
p1.setBankAccount(a1); // 이 부분은 어떻게 처리할까요?
|
cs |
↓
public class BankAccount {
private Person owner;
...
public BankAccount(Person owner) {
this.owner = owner;
owner.setAccount(this);
}
...
}
|
cs |
생성자로서의 사용
- this는 현재 클래스의 생성자로 사용할 수 있음
생성자가 여러 개 있을 경우
public class Person {
String name;
int age;
int cashAmount;
public Person(String name) {
this.name = name;
age = 12;
cashAmount = 0;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
cashAmount = 0;
}
public Person(String name, int age, int cashAmount) {
if(age < 0) {
this.age = 12;
} else {
this.age = age;
}
if(cashAmount < 0) {
this.cashAmount = 0;
} else {
this.cashAmount = cashAmount;
}
this.name = name;
}
}
|
cs |
↓
this를 사용해서 바꾼 경우
public class Person {
String name;
int age;
int cashAmount;
public Person(String name) {
this(name, 12, 0); // 12살을 기본 나이로 설정, 초기 현금 보유액은 0원.
}
public Person(String name, int age) {
this(name, age, 0); // 초기 현금 보유액은 0원.
}
public Person(String name, int age, int cashAmount) {
if(age < 0) {
this.age = 12;
} else {
this.age = age;
}
if(cashAmount < 0) {
this.cashAmount = 0;
} else {
this.cashAmount = cashAmount;
}
this.name = name;
}
}
|
cs |
- 첫 번째 경우의 this(name, 12, 0); 은 세 번째 생성자 Person(name, 12, 0); 에 각각의 파라미터를 넘겨 호출하는 것과 같음
- 두 번째 경우의 this(name, age, 0); 은 Person(name, age, 0); 에 파라미터를 넘겨 호출하는 것과 같음
- 이처럼 파라미터가 가장 많은 생성자를 파라미터가 적은 쪽에서 호출 하는 것이 가장 효율적