JAVA 입문 - 생성자
지난 글: [프로그래밍 언어/JAVA] - JAVA 입문 - 클래스와 인스턴스
생성자


위 사진에처럼 JAVA에서 클래스를 생성할 때 사용하는 Person( ) 같은 함수를 생성자라고 한다.
클래스의 멤버 변수는 메서드에 의해 값이 변경될 수도 있지만, 처음 클래스를 생성할 때
값을 정해야 하는 경우도 있다. 생성자가 하는 일은 클래스를 처음 만들 때 멤버 변수나 상수를
초기화하는 것이다.
디폴트 생성자
생성자는 클래스를 생성할 때만 호출한다. 생성자 이름은 클래스 이름과 같고,
생성자는 반환 값이 없다. 그런데 첫 번째 사진 Person 클래스를 보면 Person( ) 같은 생성자가
따로 없다. 생성자가 없는 클래스는 클래스 파일을 컴파일할 때 JAVA컴파일러에서 자동으로
생성자를 만들어 준다. 이렇게 자동으로 만들어 주는 생성자를 디폴트 생성자(default constructor)라고 한다.
디폴트 생성자는 매개 변수가 없고 구현 코드도 없다. 하지만 프로그래머가 디폴트 생성자를 직접 만드는
경우에는 필요에 따라 직접 코드를 구현할 수도 있다.

생성자 만들기
프로그래머가 직접 생성자를 만드는 경우는 인스턴스가 생성됨과 동시에 멤버 변수의 값을
지정하고 인스턴스를 초기화하기 위해 생성자를 직접 구현하여 사용한다.

새로 만든 생성자는 문자열 String형 매개변수를 하나 입력받아서 이름을 지정한다.
그런데 이대로 Person 클래스를 저장하면 컴파일되는 순간 이전에 만든 PersonTest 코드에서
오류가 난다.

오류가 난 이유는 생성자를 직접 구현하여 디폴트 생성자가 없기 때문이다.
JAVA 컴파일러는 생성자가 하나도 없는 경우에만 디폴트 생성자를 제공한다.
프로그래머가 생성자를 직접 추가하면 디폴트 생성자는 만들어지지 않기에 PersonTest 코드에
디폴트 생성자가 없어서 오류가 난 것이다. 오류를 없애려면 매개변수가 있는 생성자로 호출하거나
프로그래머가 디폴트 생성자를 추가로 직접 구현하면 된다.

이렇게 디폴트 생성자를 직접 추가하면 PersonTest 코드에서 더 이상 오류가 발생하지 않는다.
이제 Person 클래스를 생성할 때 디폴트 생성자로 클래스를 생성하는 것과 이름을 매개변수로
받아 클래스를 생성하는 것 두 가지 중 하나를 선택해 사용할 수 있다.
생성자 오버로드
이렇게 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드라고 한다.
필요에 따라 매개변수가 다른 생성자를 여러 개 만들 수 있다.
클래스에 생성자를 여러 개 제공하면 이 클래스를 사용하는 코드에서는 원하는 생성자를 선택해
사용할 수 있다. 경우에 따라서 클래스에서 일부러 디폴트 생성자를 제공하지 않기도 한다.

학생이 생성될 때는 반드시 학번이 있어야 한다면 사진처럼 생성자를 제공할 수도 있다.
이러한 경우에는 항상 학번을 사용하여 Student 클래스를 생성할 수 있다.
이 경우 디폴트 생성자를 구현하지 않는다. 왜냐하면 학생이 생성될 때 학번이 꼭 필요해서이다.
즉 매개변수가 있는 생성자를 추가한다고 해서 프로그래머가 꼭 디폴트 생성자를 직접
추가해야하는 것은 아니다.
생성자 오버로드 살펴보기
위에서 생성자의 역할은 주로 클래스를 처음 만들 때 멤버변수나 상수의 초기화라고 했다.
아래와 같이 Person 클래스에서 여러 가지 생성자를 제공한다면 이 클래스를 사용하여 인스턴스를
만드는 경우에 필요한 생성자를 골라서 사용할 수 있다.

이런 Person 클래스가 있을 때 이 클래스를 사용하는 PersonTest 클래스는 다음과 같이 구현할 수 있다.

사진처럼 디폴트 생성자를 사용하는 경우와 매개변수가 있는 생성자를 사용하는 경우를 각각 보여줬다.
붉은 상자처럼 디폴트 생성자를 사용하는 경우 클래스를 생성한 후 멤버 변수 값을 따로 초기화 한다.
하지만 푸른 상자처럼 매개변수가 있는 생성자를 사용할 경우 생성자 내부에서 변수를 초기화할 수 있도록
구현되어 있으므로 코드도 간결하고 사용하기도 편리하다.
참고 서적: 자바 프로그래밍 입문 - 박은종