생성자란?
: 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
: 따라서 인스턴스 변수의 초기화 작업에 주로 사용, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용
* 생성자가 갖는 몇 가지 특징만 제외하면 메서드와 다르지 않음
생성자의 조건
1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.
연산자 "new"가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
* 예시코드
Card c = new Card();
/*
1. 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
2. 생성자 Card()가 호출되어 수행된다.
3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.
*/
★ 인스턴스를 생성할 때는 반드시 클래스 내에 정의된 생성자 중의 하나를 선택하여 지정해주어야 한다.
기본 생성자
: 매개변수가 없고 아무런 내용도 없는 생성자
클래스이름() { }
Card() { }
소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 기본 생성자를 추가하여 컴파일한다.
class Data1{
int value;
}
class Data2{
int value;
Data2(int x) { // 매개변수가 있는 생성자
value = x;
}
}
class ConstructorTest {
public static void main(String[] args) {
Data d1 = new Data1();
Data d2 = new Data2(); // occur compile error
}
}
Data1 에는 생성자가 하나도 없으므로 기본 생성자가 추가됨.
Data2 에는 Data2(int x) {매개변수가 있는 생성자} 가 정의되어 있고, Data2()가 정의되어 있지 않기 때문에 에러 발생.
매개변수가 있는 생성자
class Car {
String color;
String gearType;
int door;
Car() {}
Car(String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
}
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
// same code
Car c = new Car("white","auto",4);
※ 매개변수가 있는 생성자를 사용함으로써 코드를 보다 간결하고 직관적으로 만든다.
생성자에서 다른 생성자 호출
: this(), this
※ 생성자 간의 서로 호출을 위한 조건
1. 생성자의 이름으로 클래스이름 대신 this를 사용한다.
2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
'this'는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼, 'this'로 인스턴스 변수에 접근할 수 있는 것이다. 하지만 'this'를 사용할 수 있는 것은 인스턴스멤버뿐이다.
static메서드(클래스메서드)에서는 인스턴스 멤버들을 사용할 수 없는 것처럼, 'this'도 사용할 수 없다.
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
this.color : 인스턴스변수
color : 지역변수
this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.
모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재
this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용
* this는 '참조변수', this()는 '생성자'이다.
생성자를 이용한 인스턴스의 복사
Car(Car c) {
color = c.color;
gearType = c.gearType;
door = c.door;
}
//same code
Car(Car c) {
//Car(String color, String gearType, int door)
this(c.color, c.gearType, c.door);
}
인스턴스를 복사하면 서로 같은 상태를 갖지만, 서로 독립적으로 메모리공간에 존재하는 별도의 인스턴스이므로 원본 인스턴스의 값이 변경되어도 복사 인스턴스는 영향을 받지 않는다.
* 인스턴스를 생성할 때 고려해야 하는 사항
- 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
- 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?
'Language > java' 카테고리의 다른 글
Java_Study 객체지향 프로그래밍 (상속) (0) | 2022.07.03 |
---|---|
Java_Study 객체지향 프로그래밍 (변수의 초기화) (0) | 2022.07.01 |
Java_Study 객체지향 프로그래밍 (오버로딩) (0) | 2022.07.01 |
Java_Study 객체지향 프로그래밍 (변수와 메서드) (0) | 2022.06.29 |
JAVA_객체지향 프로그래밍 (클래스와 객체) (0) | 2022.06.29 |
댓글