JAVA/JAVA 기본정리

생성자에서 다른 생성자 호출하기/ 참조변수 this와 생성자 this()

hyun-1200 2022. 4. 26. 00:00

참조변수 this

  • 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있다.
  •  생성자를 포함한 모든 인스턴스메서드에는 참조변수 'this'가 지역변수로 숨겨진 채로 존재한다.
    • ex. long a, b; -> this.a,  this.b 가 진짜 이름이지만 this를 생략해서 사용 가능하다.
  • static메서드 에서는 this 사용불가하다. 인스턴스멤버만 this를 사용할 수 있다. 
  • 생성자와 모든 인스턴스메서드 내에서 사용가능하다. 

 

this(), this(매개변수)

- 생성자. 같은 클래스의 다른 생성자를 호출할 때 사용한다. 

 

* this와 this()는 비슷하게 생겼을 뿐 완전히 다른 것이다.
this는 '참조변수'이고 this()는 '생성자'이다.
this
:  인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있다.
          모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다. 
this(), this(매개변수) :  생성자. 같은 클래스의 다른 생성자를 호출할 때 사용한다. 

 

 

아래 예시를 통해 더 자세히 알아보자. 


 this(), this(매개변수)의 사용법생성자에서 다른 생성자 호출하기 

 

생성자 간 호출하기 위한 조건

1. 생성자의 이름으로 클래스 이름 대신 this를 사용 ( = this() ) 한다.

2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫줄에서만 호출이 가능하다.

// 1. 잘못된 다른생성자 호출방법 
Car(String color){
	door= 5;
    Car(color,"auto",4); 
    // 1) 생성자의 첫번째줄이 아닌 두번째줄에서 호출됨 (첫번째줄에서 호출해아함)
    // 2) this(color, "auto",4)로 호출해야함 (생성자의 이름으로 클래스이름 대신 this사용) 
}

// 2. 올바른 다른생성자 호출방법
Car(String color){
	this(color,"auto",4); 
}
  • 생성자에서 다른 생성자를 호출할 때는 클래스 이름인 'Car'대신 'this'를 사용해야 하고, 첫번째줄에서 호출해야 한다. 
  • 첫 줄에서만 호출이 가능하도록 한 이유는 생성자 내에서 초기화 작업도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질수도 있기 때문이다. 
class Car{
	String color;
    String gearType;
    int door;
    
    Car(){
    	this("white","auto",4);  //Car(String color, String gearType, int door)를 호출 
        /* 아래와 동일한 코드지만 더 간략하게 활용 가능 
        color = "white";
        gearType= "auto";
        door= 4; 
        */
    }
    Car(String color){
    	this(color, "auto",4); 
    }
    Car(String color, String gearType, int door){
    	this.color= color;
        this.gearType = gearType;
        this.door= door;
    }
 }
 
 class CarTest2{
 	public static void main(String[] args){
    
    	Car c1= new Car();
        Car c2 = new Car("blue");
        
    }
 }

 


this 의 사용법 : 인스턴스변수와 지역변수 구별하기 

 

1. 인스턴스 변수명 지역변수명이 다른경우 : 문제없이 사용가능 

  • color= c; 는 생성자의 매개변수로 선언된 지역변수 c의 값을 인스턴스변수 color에 저장한다.
  • 변수 color와 c는 이름만으로 인스턴스 변수인지 지역변수인지 구분이 가능하기 때문에 아무런 문제가 없다.

2. 인스턴스 변수명과 지역변수명이 같은 경우: 이름만으로 구별 불가. 문제 발생

  • 매개변수로 선언된 지역변수와 인스턴스 변수가 color로 같을 경우에는 이름만으로는 두 변수가 구별이 안된다. 
  • 이런 경우에 인스턴수 변수 앞에 'this'를 사용하면 된다. 

인스턴스 변수, 지역변수, 클래스변수가 헷갈린다면 아래 링크 참조하여 다시 공부 

https://hyun-1200.tistory.com/4 

 

클래스의 정의/ 변수와 메서드/ 클래스변수/ 인스턴스 변수/ 지역변수

클래스의 관점 설계도 데이터+ 함수 사용자 정의 클래스의 또 다른 정의 : 클래스는 데이터와 함수의 결합의 의미를 가진다. 또는 사용자정의 타입의 의미도 있다. 프로그래밍 언어에서 데이터

hyun-1200.tistory.com


 

3. 인스턴스 변수명과 지역변수명이 같지만, 인스턴스 변수명에 this를 붙여 구별 : 문제없이 사용 가능

 

1번과 3번은 같은 코드이다.

생성자의 매개변수명과 인스턴스 변수명이 일치하는 경우가 자주있으므로, 1번 코드보다 3번 코드를 사용하는것이 의미가 더 명확하고 이해하기가 쉽다.