반응형

생성자 this()

  • 생성자에서 다른 생성자 호출할 때 사용
  • 다른 생성자 호출시 첫 줄에서만 사용가능

 

이번시간에는 생성자 this에 대해서 알아볼 것이다.
생성자 this는 같은 클래스에 있는 생성자에서 다른 생성자를 호출할 때 사용한다.

예제를 Ex6_14를 보자.

생성자가 3개있다. 
1번, 2번생성자가 3번을 호출한다.

호출할 때, 이름을 Car2를 써야하는데,  이걸 안쓰고 이름을 this라고 쓰는 것이다.
이렇게 this("white", "auto", 4); 를 쓰지만, 실제 의미는,  Car2(String color, String gearType, int door)를 호출하는 것이다.

같은 클래스안에 있는 있는 생성자들끼리 호출할 때는, 클래스 이름 대신에 this를 쓴다. 
왜그렇게하냐면, 규칙이다.
그리고, 호출할 때, 생성자의 첫 줄에서만 사용가능하다.

이렇게 호출하면 에러가 발생한다.
그래서 에러를 해결하려면,
우선, 같은 클래스 안에 있는 다른 생성자를 호출 할 때는 클래스 이름이 아닌, this를 사용해야 하고, 다른 생성자를 호출하려면 첫줄에서만 사용해야 한다.

생성자들은 하는일이 iv초기화이다.
하는일이 비슷하다. 오버로딩에서도 언급햇듯, 이름이 같은 메서드들은 하는일이 비슷하도록 되어있다.
생성자도 이름이 같으므로 이름이 같다.

코드의 중복을 제거하려고 서로 호출하는 경우가 많다.
같은 작업을 하는 코드를 여러 번 쓰는 것 보다 서로 호출하도록 짜는 것이 코드의 중복을 제거할 수 있다.

근데 그렇게 할 때, 클래스 이름을 쓰지 않고 this()라는 것을 사용하는 것이다.

 

이런 Car클래스가 있을 때, 생성자가 2개 있는데, 
첫번째는 매개변수가 없는 기본 생성자이다. 그 이야기는, iv들을 어떤 값으로 초기화 할지 값을 주지 않은 것이다. 그래서 디폴트 값으로 초기화 하는 것이다. 차색깔이나, 기어타입, 문개수를 지정하지 않으면, 기본적으로 흰색, 오토, 문4개로 초기화된다.

두번째 생성자처럼 매개변수를 주고, 주는대로 초기화되는데, 
매개변수를 주지 않으면 (지정해주지 않으면) 디폴트값을 white, auto, 4로 하라는 뜻이다. 

그런데, 위의 두 생성자를 보면, 거의 비슷하다.
이러한 것을 "코드의 중복"이라고 한다.
"코드의 중복"은 반드시 제거되어야 한다.

생성자 둘 중에 하나가 없어져야 한다.
어떻게 처리할 수 있을까?

 위에 있는 생성자에서 아래있는 생성자를 호출하도록 바꾸면 된다.

쉽게 정리하자면,
차의 옵션을 지정하지 않은채로 기본옵션을 희망하는 경우에는,
this()생성자를 이용하여 기존의 디폴트 옵션을 파라미터로 입력하여 같은클래스에 있는 다른 생성자(코드의 중복을 야기했던)를 호출하면 더 효율적인 코드가 된다.

this()생성자를 이용하여 코드의 중복을 제거하여도 중복코드를 제거하기 전과 동일하게 호출할 수 있다.
코드는 간단하게 수정되는데도 말이다.

즉, 코드의 중복을 제거하려면, 어느 한쪽이 어느 다른쪽을 호출하도록 하면 된다.

 


 

참조변수 this

  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서 사용가능
  • 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

 

이번에는 참조변수 this이다. 앞서 공부한 생성자 this()와 비슷하게 생겼지만, 전혀 다르다.
서로 다르기 때문에 연관시키지 말고 생각해야 한다.

참조변수 this는 인스턴스(객체)가 자신을 가리키는 참조변수이다.
그리고 인스턴스 메서드에서 사용이 가능하며, 생성자에서도 사용이 가능하다. 생성자도 인스턴스 메서드의 일부이기 때문.
지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용이 가능하다.

 

이번에는 코드를 보면서 알아보자.

왼쪽 코드를 보면,
Car(String c, String g, int d)에서 c, g, d는 모두 지역변수(lv)이다.
그리고 color, gearType, door는 인스턴스변수(iv)이다.

이 생성자에서는 lv와 iv의 이름이 다르다. 그래서 구별이 된다.

 

이번에는 오른쪽 코드를 보자.

String color, String gearType, int door  그리고 color, gearType, door는 지역변수(lv)이고, 
this.color, this.gearType, this.foor는 인스턴스변수(iv)이다. 

근데 만약에 this가 없으면, 둘다 lv로 간주가 된다.
왜냐하면 String color, String gearType, int door과 가까운쪽 이라 lv로 취급되기 때문이다.

그래서 this가 있어야 iv로 간주된다.

원래 우리가 iv를 사용할 때는, '참조변수.변수이름' 이렇게 사용하는데,
같은 클래스 안에서는 생략이 가능하므로 왼쪽 코드에서는 this를 생략한 것이고,

오른쪽 코드에서는 변수이름이 똑같기 때문에 구별이 안된다. 따라서 생략이 불가능하다.
왜냐하면 인스턴스변수(iv)와 지역변수(lv)를 구별해야 하기 때문이다.

 


 

참조변수 this와 생성자 this()

this는 인스턴스 객체 자신을 가리키는 참조변수이다. 그리고 참조변수이므로 인스턴스의 주소가 저장되어 있다. 
그리고, 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다는 것은, 따로 선언하지 않아도 사용 가능하다는 것이다.

그리고 this(), this(매개변수)는 생성자이다. 그리고, 같은 클래스의 다른 생성자를 호출할 때는, 클래스 이름 대신 this()를 사용한다.

두개는 완전히 다른 것이다. 연관 짓지 말것!

 

 

이 클래스를 보자.
long a, b는 iv이다. 이 둘의 진짜 이름은 this.a, this.b이다. 

그래서 생성자에서 this.a, this.b는 iv이고, a, b는 lv이다.  이렇게 이름이 같을 때는, this를 붙여서 iv와 lv를 구별한다!
만약에 this가 없으면 다 lv로 간주된다. 이럴때에는 생략이 불가능하다.

인스턴스메서드에서 a + b의 a, b는 iv다. 그런데, 원래는 this.a + this.b와 동일하다.
this가 붙어야 한다. 왜냐하면 인스턴스 메서드의 a, b는 iv이기 때문이다. 근데 this를 생략가능해서 생략하는 것 뿐이다.

static메서드는 객체 생성없이 호출하기 때문에, 여기서는 iv를 사용할 수 없다. 따라서 this를 사용할 수 없다.
따라서 a , b는 lv이다.

this를 선언하지 않아도, 생성자와 인스턴스 메서드에서만 사용 가능하다.
그러나, 클래스메서드(static 메서드)에서는 this를 사용할 수 없다.

반응형

'JAVA' 카테고리의 다른 글

상속  (0) 2022.03.30
변수의 초기화, 멤버 변수의 초기화  (0) 2022.03.29
생성자, 기본 생성자  (0) 2022.03.29
오버로딩  (1) 2022.03.28
static메서드와 인스턴스 메서드  (0) 2022.03.28