this : 메소드에서 현재 인스턴스를 가리키는 역할을 한다.
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();
}
}
Hi. My name is 김용선
Hi. My name is 안혜진
p1.sayHello();는 sayHello 메소드를 호출한다. sayHello 메소드가 실행될 때 this는 현재 인스턴스인 p1이다. p1.name은 "김용선"이기 때문에 위와 같은 출력값이 나온다. 마찬가지로 p2.sayHello();를 하면 this는 현재 인스턴스인 p2를 가리킵니다.
일반 메소드에서의 사용
우리가 작성한 Person 클래스의 setName 메소드 입니다.
public class Person {
private String name;
...
public void setName(String pName) {
name = pName;
}
...
}
이 메소드는 Person 클래스 내부에 있다. 만약 파라미터의 이름을 name으로 바꾸면 어떻게 될까?
public class Person {
private String name;
...
public void setName(String name) {
name = name;
}
...
}
name = name;이라는 애매한 코드가 생기게 된다. 두 name은 서로 같은 변수이며, 클래스의 인스턴스 변수가 아닌 파라미터를 가리키게 된다. 해당 위치(setName 메소드)에서 인스턴스 변수 name보다 파라미터 변수 name이 더 가깝기 때문이다. 이런 상황에서, 이 클래스로 생성된 인스턴스 변수 name을 가리키고 싶다면 아래처럼 this을 사용하면 된다.
public void setName(String name) {
this.name = name;
}
생성자에서의 사용
생성자에서도 동일하게 적용 가능하다.
이전에 실습 과제로 만든 BankAccount의 생성자를 보자.
public class BankAcount {
private Person owner;
...
public BankAccount(Person pOwner) {
owner = pOwner;
}
...
}
여기서도 this를 사용할 수 있다.
public BankAccount(Person owner) {
this.owner = owner;
}
파라미터로 owner 인스턴스를 받고, 바로 BankAccount의 인스턴스 변수에 넣어주었다.
그렇다면 BankAccount의 인스턴스를 Person의 인스턴스에 넣어주는 것은 어떻게 할 수 있을까?
원래는 이렇게 했었는데,
// 은행 계좌 생성
BankAccount a1 = new BankAccount(p1);
a1.setBalance(10000);
p1.setAccount(a1); // 이 부분은 어떻게 처리할까요?
// a1.setOwner(p1); 생성자에서 처리하였음.
this 키워드를 사용하면 이렇게 바꿀 수 있다.
public class BankAccount {
// 생성자
public BankAccount(Person owner) {
this.owner = owner;
owner.setAccount(this);
}
}
생성자로서의 사용
this는 현재 클래스의 생성자로 사용할 수도 있다.
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;
}
뭔가 반복적인 게 많은데, this를 사용하면 훨씬 깔끔하게 작성할 수 있다.
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;
}
첫 번째 경우의 this(name, 12, 0);은 세 번째 생성자 Person(name, 12, 0);에 각각의 파라미터를 넘겨 호출하는 것과 같다고 생각할 수 있고, 두 번째 경우의 this(name, age, 0);은 Person(name, age, 0);에 파라미터를 넘겨 호출하는것과 같다고 생각할 수 있다.
이렇게 파라미터가 가장 많은 생성자를 파라미터가 적은 쪽에서 호출 하는 것이 가장 효율적이다.
'TIL > Java' 카테고리의 다른 글
[Java] 중간고사: 문제 해결 능력 기르기_평균값 계산기 (0) | 2022.01.05 |
---|---|
[Java] 실습과제_특가 할인 매장 (0) | 2022.01.05 |
[Java] 생성자(Constructor) (0) | 2022.01.03 |
[Java] 은행 시뮬레이션 프로그램_계좌 이체 메소드 작성하기 (0) | 2022.01.02 |
[Java] 접근 제어자 (0) | 2021.12.31 |