생성자에서 다른 생성자 부르기 this() (vs this. 과의 차이)

하히호호·2024년 4월 5일
0

getter와 setter_ this.까지 정리

지난 캡슐화를 배우면서 접근제한자와 getter와 setter를 배우면서 this.까지 정리했다.
오늘은 같은 단어인 this이지만 사용이 다른, this()를 알아보고자 한다.
this()를 구분하기 위해서는 this.을 먼저 이해하고 오는게 좋다.

전혀 다른 키워드이다.


지난 코드를 생각해보면,
초기화하는 방법 중 setter를 이용할때 this.을 사용했다.
Java는 setter메서드에서 매개변수로 가져온 값을 대입할 때, 같은 변수명을 사용하면 따로 구분하지 못한다.
지역변수의 변수를 그냥 사용한다. 즉, 자기 자신에게 값을 대입한다.

이렇게 되면 setter로 들어온 값은 멤버 변수에 초기화 되지 않고 지역 변수에만 저장되고 끝난다. heap메모리에서 머물다가 끝난다.
멤버 변수(클래스의 전역변수)에 초기화를 시키면 static메모리 저장된다.


생성자안에 다른 생성자를 포함시킬 수 없을까?
메서드 안에 메서드는 호출할 수 있다.
생성자는 특별한(?) 메서드이기에 특정 생성자 안에서 다른 생성자를 부르는 로직이 필요하다? 이때 this() 가 쓰인다.

this()

package my;

public class TestThisMethod {

	public TestThisMethod() {
		//기본 생성자
	}
	
	public TestThisMethod(int i) {
		System.out.println("1번째 기능이 들어가있다."+i);
	}
	
	public TestThisMethod(String st) {
		System.out.println("2번째 기능이 들어가있다."+st);
	}
}

다른 생성자로 호출되면 각 기능을 하고싶지만, 기본 생성자가 호출되면 다른 생성자의 기능도 함께 진행되면 좋겠다면 기본 생성자에 다른 생성자를 불러야한다.
일반 메서드처럼 직접 불러야하나?

package my;

public class TestThisMethod {

	public TestThisMethod() {
		TestThisMethod(2);
		haha(); //생성자가 일반 메서드를 불러오는 방법
		System.out.println("기본생성자입니다.");
	}
	
	public TestThisMethod(int i) {
		System.out.println("1번째 기능이 들어가있다."+i);
	}
	
	public TestThisMethod(String st) {
		System.out.println("2번째 기능이 들어가있다."+st);
	}
}

오류 메시지
The method TestThisMethod(int) is undefined for the type TestThisMethod

이런 메서드는 없다는 오류메시지가 뜬다. 물론 new키워드를 사용하고 불러낼 수 있다.

public TestThisMethod() {
		new TestThisMethod(2);
		System.out.println("기본생성자입니다.");
	}

new 키워드를 사용해 객체를 생성한다는 것은 동적메모리(heap)에 저장된다는 의미이다.
new키워드를 사용하지 않고 생성자를 부르는 키워드가 있다.
this를 사용해서 다른 생성자의 기능을 넣어야겠다.

this 사용 코드

package my;

public class TestThisMethod {

	public TestThisMethod() {
		this(0);
		System.out.println("기본생성자입니다.");
	}
	
	public TestThisMethod(int i) {
		System.out.println("1번째 기능이 들어가있다."+i);
	}
	
	public TestThisMethod(String st) {
		System.out.println("2번째 기능이 들어가있다."+st);
	}
	
	private void haha() {
		System.out.println("hhhhaaaa");
	}
}

위와 같이 this();를 사용하면된다.

생성자가 여러개면 this로 어떻게 구분하나요?

this()는 인자로 구분합니다.
생성자 오버로딩을 했으니, 인자의 타입이나 개수, 순서로 구분한다.

this를 사용하니 컴파일 에러가 발생합니다.

오류
Constructor call must be the first statement in a constructor

생성자는 다른 생성자를 호출할 수 있지만 다른 행위보다 가장 먼저 생성해야합니다.
그렇지 않으면 위의 에러 메시지와 함께 컴파일 에러가 나타납니다.

정리

this() 키워드를 알아봤다. this.와 키워드만 같지 아예 다른 기능을 한다는 것을 알 수 있다.

  • this.
    메서드에서 멤버변수를 지정할때 사용하는 키워드이다.
    this.변수명 은 "나는 멤버 변수야!"라는 의미이다.

  • this()

A생성자를 실행할때 B생성자의 기능 사용이 필수인 경우,
A생성자 안에 호출을 시키는 것이다.
당연하지만 다른 곳에서 B생성자를 호출한다면, B생성자는 따로 실행 할 수도 있다.

profile
읽히는 코드를 짜고싶습니다.

0개의 댓글