생성자(constructor)는 특별한 메소드로 내가 원한다고 해서 호출하는 것이 아니라, 인스턴스가 생성되는 시점(new)에 딱 한번 호출된다.
생성자는 메서드 이름이 클래스 이름과 같기 때문에 대문자로 시작하며 아래와 같은 형태를 갖는다.
modifier 클래스명 ( 파라미터 ... ) { }
모든 객체는 반드시 한 개 이상의 생성자를 갖으며 오버로딩이 가능하며 선언하지 않으면 자동으로 선언된다.
객체를 생성하면 오버로딩이라 할 지라도 모든 생성자 메소드가 다 생성된다.
public class Test {
public Test() { //생성자에는 리턴타입이 없다.
...
}
public Test( int arg1, int arg2 ) { //오버로딩도 가능하다.
...
}
같은 클래스 내에서 오버로딩 된 다른 생성자 하나를 호출하는 것은 생성자 구현부 첫번째 줄에서만 가능하다.
this( 파라메터 ... );
의 행태로 가능!!
생성자의 활용
생성자의 접근제한자를 활용하면 클래스의 인스턴스 생성을 효과적으로 통제해줄 수 있다.
class Test { private Test() { //이 클래스는 생성자가 private 이므로 외부에서 직접 호출할 수 없다. ... } //따라서 내부에 public static으로 Test 클래스형 리턴값을 갖는 메소드를 만들어 자체적으로 //클래스를 생성하여 반환하는 형태로 사용하게 된다. public static Test getInstance() { return New Test(); } } Test t = Test.getInstance(); //이런식으로 외부에서 가져오는 형태로 사용한다. // 좀더 세련되게 아래와 같이 사용한다. // getInstance()를 실행할 때마다 새로 생성할 필요는 없으므로, // 이미 생성했을 경우 해당 객체를 다시 반환해주는 형태이다. class Test { static Test t; private Test() { //이 클래스는 외부에서 직접 호출할 수 없다. ... } public static Test getInstance() { //Test 클래스형 리턴값을 갖도록.. if( t == null ) t = new Test(); // 한번도 생성되지 않은 경우에만 객체 생성 return t; } } Test t = Test.getInstance(); //이런식으로 외부에서 가져오는 형태로 사용한다.