2010. 7. 7. 00:08

자바 생성자(Constructor)와 오버로딩(Overloading)



처음에 클래스를 만든 후 객체를 생성함으로써 그것을 사용할 수 있다. 이렇게 `객체의 인스턴스(instance)`를 생성하는 것은 메모리의 Heap 영역에 클래스를 위한 공간을 확보하기 위한 과정이다. 이렇게 하려면 `생성자(constructor)`라는 것을 호출해야 되는데, 기본 자료형 변수 선언과 같이 사용자가 만든 `클래스 형`변수를 선언한다고 생각하면 된다. 이미 앞에서 해본 바 대로다.

클래스명 클래스변수명 ;
클래스 변수명 = new 클래스 명() ;

예를 들어, 도서에 대한 객체를 'Book'이라는 이름의 클래스로 다음과 같이 만들었다고 하면 ,

class Book {
    String title ;
} 
//그 객체 생성은 다음과 같다.
Book book ;
book = new Book() ;
이 것을 한 줄로 줄여 Book book = new Book() ; 으로 해도 되는데 이처럼 클래스에 대한 변수선언과 동시에 생성할 수도 있고, 위에서와 같이 선언먼저 해놓고 나중에 필요한 시점에 따로 생성해도 된다. 어쨌든 생성자를 호출한 이후부터 사용이 가능하고, 자바는 반드시 이 과정을 거쳐야 된다.

정리해보면 생성자란 클래스 이름과 같고 객체생성시 꼭 호출되어야 하는 특별한 메소드이다. 하지만, 우리가 Book()이라는 메소드를 정의한 적이 없는데도 호출할 수 있는 것은 일단 클래스가 만들어지면 그와 동일한 이름을 가지는 메소드(생성자)가 자동으로 생기기 때문이다. 우리는 사용하기 위해 호출을 해주면 된다.

하 지만, 기본적으로 생기는 생성자외 사용자의 편리에 의해 다른 형태의 생성자를 직접 만들 수도 있는데, 자바의 특성이자 여러가지 장점이 있다. 어떨때에는 반드시 이렇게 해야하는 경우도 생긴다. 클래스를 하나 더 만들어 보자.
class Book {
    String title ;

    Book(String str) {
        title = str ;
    }
}
이 경우 객체를 생성할때 다음과 같이 반드시 매개변수(파라메타) 값을 명시해야 한다. Book book = new Book("자바 프로그래밍") ;이와 같이 개발자가 직접 생성자를 만들게되면 아무런 매개변수가 없는 기본생성자는 자동으로 생성되지 않아 더이상 사용할 수 없게 됨을 유의해야 한다.

기본생성자도 필요하기 때문에 따라서, 매개변수가 없는 생성자도 아래와 같이 하나 만들어 두어야 한다. 생성자는 여러개 만들 수 있다. '오버로딩(over loading)' 개념으로 메소드 이름은 같고 원형이 다른 형태이다.
class Book {
    String title ;

    Book() {
    }
    Book(String str) {
        title = str ;
    }
}