생성자란 메모리 내 객체가 생성될 때 자동적으로 단 한번 호출되어 객체의 구조를 인식하고 생성되는 객체의 멤버변수들을 초기화하는 데 목적을 둔 것을 말한다. 생성자의 특징으로는
class Car{
int speed;
public void setSpeed(int s){
speed = s;
}
}
Car car = new Car();
new 연산자 뒤로 오는 것을 생성자란 것인데. 위 예문과 같이 전달되는 인자가 없는 생성자를 default 생성자라고 한다. 또한 생성자라는 형태의 메서드가 Car class 내부에 존재하지 않는데도 사용할 수 있는데 이는 개발자가 생성자를 class 내부에 단 1개도 정의하지 않았을 경우 컴파일러가 컴파일할 때 자동으로 정의해주기 때문이다. 하지만 개발자가 class의 생성자를 1개 이상 정의했다면 default 생성자를 자동으로 만들어주지 않는다.
Car class는 클래스를 생성자로 생성한 뒤에 speed 변수의 값을 setSpeed를 통해 설정해줘야한다. 지금은 단 조그만 수정이고 나 혼자 개발한다면 기억하고 있으면 되겠지만 1개가 아닌 여러개의 필수값들이 존재하게되고 여러명이서 개발하는 과정이라 한다면 이 부분을 어떻게 다 지키면서 개발할 수 있을까? 그 방법은 생성자를 생성할때 매개변수를 필수값으로 입력받게 하면 된다.
class Car{
private int speed;
public Car(int s){
speed = s;
}
public void setSpeed(int s){
speed = s;
}
}
위 Car class를 다음과 같이 수정한다면 컴파일러는 컴파일할 때 default 생성자를 만들지 않게 되고
Car car = new Car(50);
이렇게 car 객체를 생성할때 speed의 값을 입력해줘야하기 때문에 생성할때 무조건 초기화를 해줄 수 있다.
생성자가 필요한 이유는 객체가 생성될 때 단 한번 수행하는 부분이므로 멤버들의 초기화 작업과 반드시 또는 단 한번만 수행해야 하는 행위 등을 생서앚에 정의해 두는 것이다. 또한 생성자를 오버로딩하여 하나의 클래스 내에 여러 개의 생성자가 존재하는 것을 생성자 오버로딩이라고 한다.
this는 특정 객체 내에서 현재 객체 자신을 의미하는 참조변수이다. 이는 자신의 객체 reference를 알릴 때 쓰이며 현재 객체의 멤버들을 접근할 때도 쓰인다.
class Test{
public Test(){
System.out.println("객체 생성시 > "+ this);
}
public static void main(String[] args){
Test t = new Test();
System.out.println("객체 생성후 > "+ t);
}
}
위 코드를 실행하면 객체를 생성할때 사용되는 this와 객체를 생성한 뒤 t의 주소값이 일치하는 것을 확인할 수 있다. 자신이 객체가 되어 메모리에 존재할 자신의 위치값을 갖고 있는 것이 this고 class를 객체화 했을 경우의 주소값을 갖고 있는 것이 this다. 또한 this()의 존재 이유는 생성자 내에서 자기 자신 즉 오버로딩된 생성자를 또 불러야할 경우가 존재하는데.
class ThisConstrEx{
String str;
public ThisConstEx(){
this(" ");
}
public ThisConstEx(int n){
this(String.valueOf(n));
}
public ThisConstEx(char c){
this(String.valueOf(c));
}
}
이렇게 다음과 같이 사용할 수 있다. this()라는 것은 현 객체의 또 다른 생성자를 호출할 수 있는 유일한 방법이지만 this()는 무조건 생성자의 첫 행에서만 사용할 수 있다. 이 방법 외의 방법을 사용하면 컴파일에서 오류가 난다.