본문 바로가기

언어공부/Java

자바 this 레퍼런스, this. 와 this()

자바 this 레퍼런스에 대해서 알아보자.

this 레퍼런스

클래스를 구성하는 인스턴스변수는 객체 생성할 때마다 새롭게 메모리 할당을 하기 때문에 객체 단위로 따로 관리된다. 하지만 멤버함수는 모든 객체가 이 멤버함수를 공유해서 사용한다. this는 참조변수로 인스턴스 자신을 가리킨다. this를 사용할 수 있는 것은 인스턴스 변수이며, static으로 정의된 클래스 메소드에서는 인스턴스 변수와 this를 사용할 수 없다.

 

*this를 사용해야만 하는 경우

메소드(생성자 포함)의 매개변수와 클래스 멤버변수가 동일한 이름일 경우 전달인자와 속성이 구분이 되지 않기 때문에 문제가 발생하는데 이를 구분짓기 위해서 속성 앞에 레퍼런스 this를 덧붙인다. 멤버변수 앞에 this를 붙여야 값이 저장된다.

 

this. 사용하는 경우

this.는 객체 자신을 가리키는 참조변수이다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것 처럼, "this"로 인스턴스 변수에 접근할 수 있다. "this"를 사용할 수 있는 것은 인스턴스 멤버 뿐이다. static메소드(클래스 메소드)에서는 인스턴스 멤버들을 사용할 수 없는 것처럼, "this"도 사용할 수 없다. static메소드는 인스턴스를 생성하지 않고도 호출될 수 있으므로 static메소드가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문이다. "this"는 모든 인스턴스 메소드에 지역변수로 숨겨진 채로 존재한다.

 

addr=addr에서 멤버변수와 생성자 소속 매개변수명이 같기 때문에 값이 대입되지 않는다.

 

위와 같이 생성자를 호출해 인스턴스를 생성했을 때, addr의 서울시는 대입되지 않는다.

 

출력화면

출력화면을 보면 addr=addr로 "서울시"가 대입되지 않아 String 초기값인 null이 출력되는 것을 볼 수 있다. 이러함을 방지하기 위해 this를 사용해야 하며, 아래와 같다.

 

this로 멤버변수와 생성자 매개변수를 구분한다.

 

메인 메소드에서  car 인스턴스를 생성하고 오버로딩된 생성자를 호출해서 멤버변수 초기화 후, pr메소드 호출.

 

출력화면

 

Member05클래스와 다르게 Car클래스의 생성자에는 this로 멤버변수와 생성자 매개변수를 구분했기 때문에 값이 대입되는 것을 확인할 수 있다. "this.color(멤버변수 color)=color(생성자 매개변수 color)"인 셈이다.

 

this() 사용하는 경우

같은 클래스의 멤버들 간에 서로 호출할 수 있는 것 처럼 생성자 간에도 서로 호출이 가능하다. 여기서 생성자의 이름으로 클래스이름 대신 this를 사용하며, 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

this로 같은 클래스 내 다른 생성자를 호출.

 

MyDate07()은 MyDate07(2021,5,6)과 같다.

 

출력화면

 

MyDate07()로 호출하게 되면 this(2021,5,6)이기 때문에 같은 클래스내 다른 생성자를 호출하므로 MyDate07(2021,5,6)과 같은 효과임을 출력화면으로 확인할 수 있다.

 

다양한 생성자 오버로딩. color, gearType, door를 고정 및 변경 할수 있고, color만 매개변수로 받아 변경 가능하다.

 

기본 생성자 호출(c01) 및 color를 blue로 생성자를 호출(c02)한다.

 

출력화면

기본생성자를 호출한 c01은 white, auto, 4로 고정되어 출력되며, color를 blue로 생성자를 호출한 c02는 차색상만 blue로 변경되고 나머지는 똑같이 auto, 4로 고정되어 출력된다. 모든 변수들을 초기화하고 싶다면 Car10("blue","manual","6")으로 호출해 초기화 하면 된다.

 

생성자에서 다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는 생성자 내에서 초기화 작업도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화를 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이다.

 

this와 this()는 비슷하게 생겼지만 완전히 다르다. this는 참조변수이고, this()는 생성자이다.