생성자란?
생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.
생성자의 조건
1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.
인스턴스를 생성하는 과정(코드 예)
Card c = new Card();
1. 연산자 new에 의해서 메모리(heap)에 Card 클래스의 인스턴스가 생성된다.
2. 생성자 Card()가 호출되어 수행된다.
3. 연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장된다.
기본 생성자
컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 기본 생성자를 추가하여 컴파일 한다.
매개변수가 있는 생성자
생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다.
생성자에서 다른 생성자 호출하기 - this(), this
- 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
코드로 이해하기) 오류인 부분을 찾아보자!
Car(String color) {
door = 5;
Car(color, "auto", 4); // 에러1. 생성자의 두 번째 줄에서 다른 생성자 호출
} // 에러2. this(color, "auto", 4);로 해야함.
생성자를 이용한 인스턴스의 복사
현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자를 이용할 수 있다. 두 인스턴스가 같은 상태를 갖는다는 것은 두 인스턴스의 모든 인스턴스 변수(상태)가 동일한 값을 갖고 있다는 것을 뜻한다. 하나의 클래스로부터 생성된 모든 인스턴스의 메서드와 클래스변수는 서로 동일하기 때문에 인스턴스 간의 차이는 인스턴스마다 각기 다른 값을 가질 수 있는 인스턴스 변수 뿐이다.
코드로 이해하기
class Car {
String color;
String gearType;
int door;
Car() {
this("white","auto",4);
}
Car(Car c){
// this(c.color, c.gearType, c.door); 로도 쓸 수 있음.
color = c.color;
gearType = c. gearType;
door = c.door;
}
Car(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
public class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car(c1);
System.out.println("c1 => "+c1.color+" "+c1.gearType+" "+c1.door);
System.out.println("c2 => "+c2.color+" "+c2.gearType+" "+c2.door);
c1.door = 100;
System.out.println("c1 => "+c1.color+" "+c1.gearType+" "+c1.door);
System.out.println("c2 => "+c2.color+" "+c2.gearType+" "+c2.door);
}
}
=> 인스턴스 c2는 c1을 복사하여 생성된 것이므로 서로 같은 상태를 갖지만, 서로 독립적으로 메모리 공간에 존재하는 별도의 인스턴스이므로 c1의 값들이 변경되어도 c2는 영향을 받지 않는다.
[참고]
Java의 정석 3판 (남궁성 저)
'공부 > 자바' 카테고리의 다른 글
상속 & 클래스 간의 관계 (0) | 2024.05.30 |
---|---|
변수의 초기화 (0) | 2024.05.29 |
오버로딩(overloading) (0) | 2024.05.29 |
객체 지향 프로그래밍(OOP) (0) | 2024.05.28 |
배열 선언과 초기화 (0) | 2024.05.26 |