[자바] 생성자, this 의 사용
생성자(constructor)
인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드 입니다.
<조건>
1. 생성자의 이름은 클래스의 이름과 같아야 함
2. 리턴값이 없음
<용도>
주로 인스턴스 변수의 초기화에 쓰임
생성자 사용의 예시
Car 클래스에
두 개의 생성자를 매개변수의 개수를 다르게 하여 오버로딩 한 경우
첫번째 생성자는 매개변수가 없는 경우, 두 번째는 String 타입x2, int 타입x1 의 매개변수를 설정한 경우다.
반환타입이 없으므로 클래스명으로 시작하고, 메서드처럼 오버로딩이 가능하다는 특징이 있다.
위와 같이 클래스를 설정해 두고, 아래와 같이 메인 메서드를 짜면 다음과 같은 결과가 나온다.
c1의 경우 매개변수를 아무것도 넣지 않았으니, 당연히 기본값으로 초기화 된다. 이후 각각의 변수에 원하는 값을 대입하여 찍어냈다.
c2의 경우 적절한 타입의 매개변수를 넘겨 초기화시켰다. 따라서 그 값이 찍히게 된다.
그럼 this 는 언제 사용하는 걸까?
위와 같이 인스턴스 변수와 생성자 내의 변수의 이름이 같을때, 지역변수와 구분하기 위해 사용한다.
위의 경우에는 String color로 받은 변수의 변수명과 Car 클래스에서 설정한 변수명이 같기 때문에 this를 사용해 구분했다.
여기서 코드의 중복성을 더 줄일 수 있을까?
아래 예시를 보자.
위의 코드의 경우, 매개변수가 하나도 없을 때, 1개일 때, 2개일 때, 3개일 때를 각각 설정하다보니 중복되는 부분이 많아진 것을 볼 수 있다.
이 때는 this의 다른 용법을 사용해서 코드의 중복성을 줄이고 재 사용성을 늘릴 수 있다. 예시는 아래와 같다.
위의 예시는 매개변수가 각각 0개, 1개인 생성자가 맨 아래 매개변수가 3개인 생성자를 호출하는 것이다.
여기서 주의할 점은,
생성자에서 다른 생성자를 호출할 경우, 생성자를 열고 첫 번째 줄에 this()를 사용해야 한다는 점이다.
다음으로, 생성자의 다른 이용을 생각해보자.
생성자는 기본적으로 인스턴스의 역할을 하기 때문에, 생성자를 활용해 인스턴스 복사를 할 수 있다.
아래는 생성자를 활용한 인스턴스 복사의 예시다.
c1을 생성한 다음, c2 와 c3에서는 매개변수로 c1을 보냈다. c1에 각각의 값이 들어있으므로 가능하다.
위와 같은 방법을 활용하면 c1의 값을 c2와 c3에서 공유하게 된다. 그러므로 인스턴스 복사의 역할을 할 수 있다.
그러나 주의할 점은 new를 통해 생성한 메모리 공간 자체는 따로 존재하며, 그러므로 생성자를 통한 인스턴스 복사는 초기값에 한하게 될 수밖에 없다.