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, 120); // 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); 에 파라미터를 넘겨 호출하는 것과 같음
  • 이처럼 파라미터가 가장 많은 생성자를 파라미터가 적은 쪽에서 호출 하는 것이 가장 효율적