- 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
- 인스턴스 생성시 수행할 작업(iv 초기화)에 사용
Time t = new Time();
t.hour = 12;
t.minute = 34;
t.second = 56;
위를 아래처럼 생성자 호출을 이용할 수 있다.
Time t = new Time(12, 34, 56);
- 이름이 클래스 이름과 같아야 한다.
클래스이름(타입 변수명, 타입 변수명, ...) { // 인스턴스 생성시 수행될 코드, // 주로 인스턴스 변수의 초기화 코드를 적는다. }
- 리턴값이 없다.(void 안붙임)
- 모든 클래스는 반드시 생성자를 가져야 한다.
Card c = new Card(); // 기본 생성자
매개변수가 없는 생성자
생성자가 하나도 없을 때만, 컴파일러가 자동 추가클래스이름() {} // 기본 생성자
Piont() {} // Point클래스의 기본 생성자
class Data_1 {
int value;
}
class Data_2 {
int value;
Data_2(int x) {
value = x;
}
}
class Ex {
public static void main(String[] args) {
Data_1 d1 = new Data_1();
Data_2 d2 = new Data_2(); // compile error
}
}
class Car {
String color; // 색상
String gearTyep; // 변속기 종류
int door; // 문의 개수
Car() {}
Car(String c, String g, int d) { // 매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}
Car c = new Car("while", "auto", 4);
- 생성자에서 다른 생성자 호출할 때 사용
- 다른 생성자 호출시 첫 줄에서만 사용가능
class Car {
String color; // 색상
String gearTyep; // 변속기 종류
int door; // 문의 개수
Car() {
this("white", "auto", 4); // Car2(String color, String gearTyep, int door)를 호출
}
Car(String color) {
this(color, "auto", 4); // Car2(String color, String gearTyep, int door)를 호출
}
Car2(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
- 인스턴스 자시을 가르키는 참조변수
- 인스턴스 메서드(생성자 포함)에서 사용가능
- 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
Car2(String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
Car2(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
this를 붙이지 않으면 가장 가까운 매개변수 color로 인식.
- 지역변수(lv)는 수동 초기화 해야함(꼭 해야함)
- 멤버변수(iv, cv)는 자동 초기화된다.
class InitTest{
int x; // 인스턴스 변수
int y = x; // 인스턴스 변수
void method1() {
int i; // 지역변수
int j = i; // 에러. 지역변수를 초기화하지않고 사용
}
}
인스턴스 변수는 유지기간이 길어 0으로 자동초기화를 시켜준다. 그런데 지역변수는 재사용이 빈번하여 0으로 초기화하지않고 새로운 값을 계속 덮어쓰는 방식을 쓰다보니 따로 초기화를 시키지않고 사용하면 오류가 뜬다.
선언시 대입연산자(=)를 사용하는것.
class Car {
int door = 4;
Engine e = new Engine();
}
- 인스턴스 초기화 블럭 : {}
- 클래스 초기화 블럭 : static {}
class StaticBlockTest {
static int[] arr = new int[10]; // 명시적 초기화
static { // 클래스 초기화 블럭 - 배열 arr을 난수로 채운다.
for(int i = 0; i < arr.length;i++) {
arr[i] = (int)(Math.random() * 10) + 1;
}
}
}
클래스 변수 초기화 시점
- 클래스가 처음 로딩될 때 단 한번
인스턴스 변수 초기화 시점- 인스턴스가 생성될 때마다