1. 생성자?
생성자(constructor)란 자바에서 클래스를 생성할 때 사용하는 함수를 뜻한다(ex : Person ( ) ).
생성자가 하는 일은 클래스를 처음 만들 때 멤버 변수나 상수를 초기화하는 것이다.
* 생성자 만들기
package contructor;
public class Person {
String name;
float height;
float weight;
}
* 생성자 테스트하기
package contructor;
public class PersonTest {
public static void main(String[] args) {
Person personlee = new Person();
}
}
* 디폴트 생성자
생성자는 클래스를 생성할 때만 호출한다.
생성자 이름은 클래스 이름과 같고, 생성자는 반환값이 없다.
그런데 위의 Person 클래스를 살펴보면 Person () 생성자가 따로 없다.
어떻게 된 것일까?
생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어준다,
이렇게 자동으로 만들어 주는 생성사를 디폴트 생성자(default constructor)라고 한다.
디폴트 생성자는 매개변수가 없고 구현 코드도 없다.
만약 프로그래머가 디폴트 생성자를 직접 만드는 경우에는 필요에 따라 직접 코드를 구현할 수도 있다.
2. 생성자 만들기
필요한 경우 프로그래머가 직접 생성자를 구현할 수도 있다.
어떤 경우에 생성자를 직접 구현할까?
생성자는 주로 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화하는 역할을 한다. 즉 인스턴스가 생성됨과 동시에 멤버변수의 값을 지정하고 인스턴스를 초기화하기 위해 생성자를 직접 구현하여 사용한다.
Person 클래스를 생성할 때 이름을 매개변수로 받는 생성자를 구현해보려 한다.
package contructor;
public class Person {
String name;
float height;
float weight;
public Person(String pname) {
name = pname;
}
}
새로 만든 생성자는 문자열 String형 매개변수를 하나 입력받아 이름을 지정한다.
그런데 이때 Person 클래스를 저장하면 컴파일되는 순간 이전에 만든 PersonTest.java 코드에서 오류가 발생한다.
이렇게 오류가 발생한 이유는 Person 클래스에 생성자를 만듬으로 디폴트 생성자가 사라졌기 때문이다.
디폴트 생성자가 자동 생성되는 경우는 아무런 생성자를 만들지 않았을 때이기 때문이다.
그렇기에 이 오류를 없애려면 매개변수가 있는 생성자로 호출하거나 프로그래머가 디폴트 생성자를 추가로 직접 구현하면 된다.
package contructor;
public class Person {
String name;
float height;
float weight;
public Person() {}
public Person(String pname) {
name = pname;
}
}
이렇게 디폴트 생성자를 직접 추가하면 PersonTest.java 파일을 실행했을 때 더 이상 오류가 발생하지 않는다.
이제 Person 클래스를 생성할 때 두 생성자 중 하나를 선택해 사용할 수 있다.
3. 생성자 오버로드
이렇게 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로드(constructor overload)라고 한다.
필요에 따라 매개변수가 다른 생성자를 여러 개 만들 수 있다.
클래스에 생성자를 여러 개 제공하면 이 클래스에서 사용하는 코드에서는 원하는 생성자를 선택해 사용할 수 있다.
그리고 경우에 따라서는 클래스에서 일부러 디폴트 생성자를 제공하지 않기도 한다.
만약 학생이 생성될 때 반드시 학번이 있어야 한다면 디폴트 생성자를 구현하지 않고 학번 생성자를 구현한다면 학번을 사용하여야만 Student 클래스를 생성할 수 있는 것이다.
생성자 오버로드에 대해 더 살펴보자.
앞에서 생성자의 역할은 주로 인스턴스 변수의 초기화라고 했다.
다음과 같이 Person 클래스에서 여러 가지 생성자를 제공한다면 이 클래스를 사용하여 인스턴스를 만드는 경우에 필요한 생성자를 골라서 사용할 수 있다.
package contructor;
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;
}
}
만약 위와 같이 생성자를 구현해내면 PersonTest.java 클래스는 다음과 같이 구현할 수 있다.
package contructor;
public class PersonTest {
public static void main(String[] args) {
Person personkim = new Person();
personkim.name = "김유신";
personkim.weight = 85.5F;
personkim.height = 180.0F;
Person personlee = new Person("이순신", 175, 75);
}
}
위의 예재는 디폴트 생성자를 사용하는 경우와 매개변수가 있는 생성자를 사용하는 두 가지 경우를 보여준다.
하지만 어떤 멤버 변수들은 외부 클래스에서 값을 지정하지 못하는 경우가 있다.
따라서 매개변수가 있는 생성자를 구현하고 이를 사용하는 것이 편리한 경우가 많다.
'⁂ Java > : 독학으로 공부하기(과거)' 카테고리의 다른 글
[java] #4-3 클래스와 인스턴스 (0) | 2022.07.06 |
---|---|
[java] #4-2 메서드와 함수 (0) | 2022.07.04 |
[java] #4-1 객체, 클래스, 패키지 (0) | 2022.07.04 |
[java] #3-2 반복문 : 제어 흐름 이해하기 (0) | 2022.07.03 |
[java] #3-1 조건문 : 제어 흐름 이해하기 (0) | 2022.07.01 |