메서드처럼 클래스 내에 선언되는 '생성자'는 메서드와 유사한 구조를 가지고 있으나 리턴값이 없다는 점이 다르다. 그럼
생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 그래서 인스턴스 변수의 초기화 작업에 주로 사용된다.
생성자의 조건은 2가지가 있다.
1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.
1) 생성자 예시
class Card{
Card(){//매개변수가 없는 생성자.}
Card(String k, int num){// 매개변수가 있는 생성자.}
}
2) 생성자 분석
클래스 이름(타입변수 명, 타입변수 명 ***){
// 인스턴스 생성 시 수행될 코드,
// 주로 인스턴스 변수의 초기화 코드를 적음.
}
생성자도 오버로딩이 가능해 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
생성자는 단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한? 메서드 일 뿐이며, 몇 가지 특징을 제외하고는 메서드와 비슷하다.
1. 기본 생성자(default constructor)
앞서 인스턴스를 생성하기 위해 사용했던 '클래스 이름()'이 바로 생성자이다.
인스턴스를 생성할 때 반드시 클래스 내에 정의된 생성자 중 하나를 선택해 지정해주어야 한다.
앞 예제도 마찬가지이지만 우리가 클래스에 생성자를 정의하지 않고도 인스턴스를 계속해서 생성할 수 있었던 이유는 컴파일러가 제공하는 '기본 생성자(default constructor)'때문이였다.
기본 생성자는 객체가 생성될 때 가장 먼저 호출되는 생성자로 개발자가 명시하지 않아도 컴파일 시점에서 자동 생성된다.
class Data1{
int value;}
class Data2{
int value;
Data2(int x){value=x;}// 매개변수가 있는 생성자.
}
class ConstructorTest{
public static void main(String[] args){
Data1 d1 = new Data1();
Data2 d2 = new Data2(); // 분명 컴파일 에러가 발생할 것임.
}
}
이렇게 코드를 입력해보면 오류가 날 것인데, 이 오류는 Data2에서 Data2()라는 생성자를 찾을 수 없다는 내용의 에러이다. 이유는 Data1에서는 정의되어 있는 생성자가 하나도 없어 컴파일러가 기본적으로 생성자를 추가해주지만, Data2에서는 Data2(int x)라는 생성자가 있어 기본 생성자가 추가되지 않았다.
그래서 이 코드에서 컴파일 에러를 방지하기 위해선,1) Data2의 인스턴스를 생성할 때 생성자 Data2(int x)를 사용하던가 아니면 2)클래스 Data2에 생성자 Data2를 추가로 정의해주면 된다.
컴파일러가 자동으로 기본 생성자를 추가해주는 경우는 '클래스 내에 생성자가 하나도 없을 때' 뿐이라는 것을 알아야 한다.
2. 사용자 정의 생성자(UserDefined constructor)
기본 생성자 외에 특정 목적에 의해 사용자가 만든 생성자로, 매개변수에 차이가 있다.
생성자도 메서드와 마찬가지로 매개변수를 선언해 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용이 가능한데 이는 매우 유용하다.
1) 매개변수가 있는 생성자의 예시
class Car{
String color; //색
String gear; // 기어
car(){} // 생성자
car(String c, String g){
color = c;
gear = g;
}
}
같은 클래스의 멤버들 간 서로를 호출이 가능한 것처럼, 생성자 간 서로 호출이 가능하지만 2가지 조건이 붙는다.
1. 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
2. 한 생성자에서 다른 생성자를 호출할 땐 반드시 첫 줄에서만 호출이 가능하다.
여기서 간단하게 짚고 넘어가야할 것이 Java에서는 this와 this()가 있는데 엄연히 다른것이다.
'this'는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼, 'this'로 인스턴스 변수에 접근할 수 있는 것이다. (사용이 제한적 = 인스턴스 멤버에만 사용 가능)
이 코드를 보면 this.x는 위의 int x를 가리키고 있다. 즉 인스턴스 변수인 x를 가리킨다(전역변수).
뒤에있는 x는 지역변수인 매개변수 x를 가리킨다. (static 메서드 안에서는 this 사용 불가.)
'this()'는 생성자를 가리킨다.
class Car{
String color; // 인스턴스 변수
String gearType;
int door;
Car(){
this("white", "auto", 4); // Car(String color, string gearType, int door)를 호출
}
Car(String color){
this(color, "auto", 4);
}
Car(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
this()는 같은 클래스의 다른 생성자를 호출할 때 사용하는데, 코드의 Car() 생성자와 Car(String color)생성자는 this()를 통해 모두 Car(String color, String gearType, int door)을 호출하고 있는 것이다.
'Language > Java' 카테고리의 다른 글
내부 클래스(inner class) (0) | 2022.01.22 |
---|---|
상속(Inheritance) (0) | 2022.01.21 |
오버로딩(overloading) (0) | 2022.01.20 |
클래스 메서드(static)와 인스턴스 메서드 (static은 무엇일까) (0) | 2022.01.20 |
장독에 지식 채우기 (모를때마다 와서 추가)-(2022.01.17ver) (0) | 2022.01.17 |