[그린컴퓨터] Server/JAVA(객체 지향 프로그래밍)

생성자 {생성자란, 생성자 만들기, 생성자 오버로드}

Ben의 프로그램 2023. 5. 17. 13:50
728x90

생성자란? {디폴트 생성자}

  • 생성자(constructor)에 대해 자세히 살펴보겠습니다. 
  • 다음과 같이 Person 과 PersonTest 클래스를 만들어 보겠습니다. 
package constructor;

public class Person {
	String name;
	float height;
	float weight;
}
package constructor;

public class PersonTest {

	public static void main(String[] args) {
		Person personLee = new Person();
	}

}
  • 위 예제에서 클래스를 생성할 때 사용하는 Person( ) 같은 함수생성자라고 합니다. 
  • 생성자가 하는 일클래스를 처음 만들 때 멤버 변수나 상수를 초기화하는 것입니다.
  • 풀어서 설명하면, 생성자는 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화하는 역할을 합니다.

디폴트 생성자

  • 생성자는 클래스를 생성할 때만 호출합니다.
  • 생성자 이름은 클래스 이름과 같다.
  • 생성자는 반환 값이 없습니다.
  • 앞에서 만든 Person 클래스에는 Person( ) 생성자가 따로 없습니다. 그럼에도 사용할 수 있는데, 어떻게 가능할까?
  • 생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어준다.
  • 이렇게 자동으로 만들어 주는 생성자를 디폴트 생성자(default constructor) 라고 합니다.
  • 디폴트 생성자는 매개변수가 없고 구현 코드도 없습니다. 

생성자 만들기

  • 필요한 경우 프로그래머가 직접 생성자를 구현할 수도 있습니다. 어떤 경우에 생성자를 직접 구현할까요?
  • 생성자는 주로 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화하는 역할을 합니다. 인스턴스가 생성됨과 동시에 멤버 변수의 값을 지정하고 인스턴스를 초기화하기 위해 생성자를 직접 구현하여 사용합니다. 
  • Person 클래스를 생성할 때 이름을 매개변수로 받는 생성자를 구현해 보겠습니다.
package constructor;

public class Person {
	String name;
	float height;
	float weight;
	
	public Person(String pname) {
		name = pname;
	}
}
  • 새로 만든 생성자 Person(String pname) 는 문자열 String 형 매개변수 pname 을 하나 입력받아서 이름을 지정합니다. 
  • 그런데 이렇게 수정을 하니까, PersonTest.java 파일에서 오류가 발생했습니다.
package constructor;

public class PersonTest {

	public static void main(String[] args) {
		Person personLee = new Person();
                             [오류발생]
	}

}
  • 오류가 난 이유생성자를 직접 구현하였기 때문에 더이상 디폴트 생성자가 없기 때문입니다.
  • 프로그래머가 생성자를 직접 추가하면 디폴트 생성자는 만들어지지 않습니다. 
  • 오류를 해결하려면 매개변수가 있는 생성자로 호출하거나 프로그래머가 직접 디폴트 생성자를 구현하면 됩니다.
package constructor;

public class Person {
	String name;
	float height;
	float weight;
	
	public Person() {
	}
	
	public Person(String pname) {
		name = pname;
	}
}
package constructor;

public class PersonTest {

	public static void main(String[] args) {
		Person personLee = new Person();
		Person personKim = new Person("Kim GilDong");
	}

}

생성자 오버로드

  • 이렇게 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드(constructor overload)라고 합니다.
  • 필요에 따라 매개변수가 다른 생성자를 여러 개 만들 수 있습니다.
  • 클래스에 생성자를 여러 개 제공하면 이 클래스를 사용하는 코드에서는 원하는 생성자를 선택해 사용할 수 있습니다. 
  • 경우에 따라서는 클래스에서 일부러 디폴트 생성자를 제공하지 않기도 합니다.
  • 다음 Student 클래스를 살펴봅시다.
package constructor;

public class Student {
	int studentID;
}
  • 해당 Student 클래스에서는 생성자를 프로그래머가 제공하지 않았으므로 디폴트 생성자가 자동으로 생길 것입니다.
  • 그런데, 학생이 생성될 때 반드시 학번이 있어야 한다면 다음처럼 생성자를 프로그래머가 제공할 수 있습니다.
package constructor;

public class Student {
	int studentID;
	
	public Student(int studentID) {
		this.studentID = studentID;
	}
}
  • 반드시 학번을 인자로 제공해야 생성자를 사용할 수 있기 때문에 인스턴스들이 학번을 반드시 가지고 생성됩니다.
  • 이 경우 디폴트 생성자를 구현하지 않습니다. 왜냐하면 학생이 생성될 때 학번을 꼭 가지도록 제한해야 하기 때문입니다. 매개변수가 있는 생성자를 추가하면 디폴트 생성자가 자동으로 생성되지 않으며, 꼭 만들지 않아도 괜찮습니다.
  • 생성자 오버로드에 대해 좀 더 살펴보겠습니다. 
  • 앞에서 생성자의 역할은 주로 인스턴스가 가지고 있는 멤버 변수의 초기화라고 했습니다.
  • 다음과 같이 Person 클래스에서 여러 가지 생성자를 제공한다면 이 클래스를 사용하여 인스턴스를 만드는 경우에 필요한 생성자를 골라서 사용할 수 있습니다.
package constructor;

public class Person {
	String name;
	float height;
	float weight;
	
	public Person() {
	}
	
	public Person(String pname) {
		name = pname;
	}
	
	public Person(String pname, float pheight, float pweight) {
		name = pname;
		height = pheight;
		weight = pweight;
	}
}
package constructor;

public class PersonTest {

	public static void main(String[] args) {
		Person personLee = new Person();
		Person personKim = new Person("Kim GilDong");
		Person personSHIN = new Person("SHIN GilDong", 178, 80);
	}

}
  • 위 예제는 디폴트 생성자를 사용하는 경우와 매개변수가 있는 생성자를 사용하는 두 가지 경우를 보여줍니다.
  • 디폴트 생성자를 사용하는 경우에는 클래스를 생성한 후 인스턴스 변수 값을 따로 초기화합니다.
  • 매개변수가 있는 생성자를 사용하면 생성자 내부에서 변수를 초기화할 수 있으므로 코드도 간결하고 사용하기도 편리니다.
  • 추후 배우는, 정보 은닉에서 배우는 것을 참고하면, 어떤 멤버 변수들은 외부 클래스에서 값을 지정하지 못하는 경우도 있습니다. 따라서 매개변수가 있는 생성자를 구현하고 이를 사용하는 것이 편리한 경우가 많습니다.