생성자(constructor)
생성자는 new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당.
객체 초기화란 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것을 말하며, 생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없음.
new 연산자에 의해 생성자가 성공적으로 실행되면 힙(heap)영역에 객체가 생성되고 객체의 번지가 리턴되며, 리턴된 객체의 번지는 클래스 변수에 저장됨.
기본 생성자
모든 클래스는 생성자가 반드시 존재하며, 생성자를 하나 이상 가질 수 있음.
객체를 다양한 값으로 초기화하기 위해서 클래스 내부에 생성자 선언을 생략했다면 기본 생성자가 자동으로 추가됨.
생성자 선언
생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일함.
생성자 블록 내부에는 객체 초기화 코드가 작성되는데, 일반적으로 필드에 초기값을 저장하거나 메소드를 호출하여 객체 사용 전에 필요한 준비를 함. 매개 변수 선언은 생략할 수도 있고 여러 개를 선언 할 수 있는데, 매개변수는 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할을 함.
클래스에 생섲아가 명시적으로 선언되어 있을 경우에는 반드시 선언된 생성자를 호출해서 객채를 생성해야함.
// 생성자 선언
package sec03.exam01;
public class Car {
// 생성자
Car(String color, int cc) {
}
}
// 생성자를 호출해서 객체 생성
package sec03.exam01;
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car("검정", 3000);
}
}
필드 초기화
클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정되는데, 만약 다른 값으로 초기화 하고 싶다면 두가지 방법이 있음.
하나는 필드를 선언할 때 초기값을 주는 방법이고, 또 다른 하나는 생성자에서 초기값을 주는 방법.
필드를 선언할 때 초기값을 주게 되면 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 갖게 됨.
하지만 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화되어야 한다면 생성자에서 초기화 해야함.
// 생성자에서 필드 초기화
package sec03.exam02;
public class Korean {
// 필드
String nation = "대한민국";
String name;
String ssn;
//생성자
public Korean(String n, String s) {
name = n;
ssn = s;
}
}
// 객체 생성 후 필드값 출력
package sec03.exam02;
public class KoreanExample {
public static void main(String[] args) {
Korean k1 = new Korean("홍길동", "011225-0987654");
System.out.println("k1.name : " + k1.name);
System.out.println("k1.ssn : " + k1.ssn);
Korean k1 = new Korean("이몽룡", "920524-0192837");
System.out.println("k2.name : " + k2.name);
System.out.println("k2.ssn : " + k2.ssn);
}
}
// 실행 결과
// k1.name : 홍길동
// k1.ssn : 011225-0987654
// k2.name : 이몽룡
// k2.ssn : 920524-0192837
*매개 변수의 이름이 너무 짧으면 코드의 가독성이 좋지 않기 때문에 가능하면 초기화시킬 필드 이름과 비슷하거나 동일한 이름을 사용하는 것이 좋음.
필드와 매개 변수 이름이 동일할 땐 생성자 내부에서 해당 필드에 접근할 수 없는데 이럴땐 필드 앞에 'this.'을 붙이면 됨.
this는 객체 자신의 참조.
생성자 오버로딩(overloading)
매개 변수를 달리하는 생성자를 여러 개 선언하는 것.
// 생성자 오버로딩
package sec03.exam03;
public class Car {
// 필드
String company = "현대";
String model;
String color;
int maxSpeed;
// 생성자
Car() {
}
Car(String model) {
this.model = model;
}
Car(String model, String color) {
this.model = model;
this.color = color;
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
// 객체 생성 시 생성자 선택
package sec03.exam03;
public class CarExample {
public static void main(String[] args) {
// 생성자 1
Car car1 = new Car();
System.out.println("car1.company : " + car1.company);
System.out.println();
// 생성자 2
Car car2 = new Car("자가용");
System.out.println("car2.company : " + car2.company);
System.out.println("car2.model : " + car2.model);
System.out.println();
// 생성자 3
Car car3 = new Car("자가용", "빨강");
System.out.println("car3.company : " + car3.company);
System.out.println("car3.model : " + car3.model);
System.out.println("car3.color : " + car3.color);
System.out.println();
// 생성자 4
Car car4 = new Car("택시", "검정", 200);
System.out.println("car4.company : " + car4.company);
System.out.println("car4.model : " + car4.model);
System.out.println("car4.color : " + car4.color);
System.out.println("car4.maxSpeed : " + car4.maxSpeed);
System.out.println();
}
}
다른 생성자 호출: this( )
생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다. 매개 변수의 수만 달리하고 필드 초기화 내용이 비슷한 생성자에서 이러한 현상을 많이 볼 수 있는데, 이 경우에는 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있음.
생성자에서 다른 생성자를 호출할 때에는 this( )를 사용.
클래스( [매개변수, ...] ) {
this( 매개변수, ..., 값, ...); // 클래스의 다른 생성자 호출
실행문;
}
* this( )는 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용 됨.
// 다른 생성자를 호출해서 중복 코드 줄이기
package sec03.exam04;
public class Car {
// 필드
String company = "현대"
String model;
String color;
int maxSpeed;
// 생성자
Car(){
}
Car(String model) {
this(model,"은색", 250);
}
Car(String model, String color) {
this(model, color, 250);
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
// 객체 생성 시 생성자 선택
package sec03.exam04;
public class CarExample {
public static void main(String[] args) {
Car car1 = new Car();
System.out.println("car1.company : " + car1.company);
System.out.println();
// 생성자 2
Car car2 = new Car("자가용");
System.out.println("car2.company : " + car2.company);
System.out.println("car2.model : " + car2.model);
System.out.println();
// 생성자 3
Car car3 = new Car("자가용", "빨강");
System.out.println("car3.company : " + car3.company);
System.out.println("car3.model : " + car3.model);
System.out.println("car3.color : " + car3.color);
System.out.println();
// 생성자 4
Car car4 = new Car("택시", "검정", 200);
System.out.println("car4.company : " + car4.company);
System.out.println("car4.model : " + car4.model);
System.out.println("car4.color : " + car4.color);
System.out.println("car4.maxSpeed : " + car4.maxSpeed);
System.out.println();
}
}
🔘 기본 생성자: 클래스 선언 시 컴파일러에 의해 자동으로 추가되는 생성자
🔘 생성자 선언: 클래스로부터 객체를 생성할 때 호출되는 생성자를 명시적으로 선언할 수 있으며, 생성자를 선언하면 기본 생성자는 생성되지 않음.
🔘 매개 변수: 생성자 호출 시 값을 전달받기 위해 선언되는 변수를 말함
🔘 객체 초기화: 객체를 사용하기 전에 준비하는 과정으로 필드를 선언할 때 초기화하거나 생성자 내부에서 필드값을 초기화할 수 있으며, 메소드를 호출하는 내용으로 구성됨.
🔘 오버로딩: 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말함.
🔘 this( ): 객체 자신의 또 다른 생성자를 호출할 때 사용.
'Java' 카테고리의 다른 글
| [Java] 인스턴스 멤버와 정적 멤버 (0) | 2025.11.10 |
|---|---|
| [Java] 메소드 (0) | 2025.11.09 |
| [Java] 필드 (0) | 2025.11.06 |
| [Java] 클래스 (0) | 2025.11.06 |
| [Java] 열거 타입 (0) | 2025.11.05 |