정의
- 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
- iv 를 처음 설정할 수 있다.
- 인스턴스 생성시 수행할 작업을 설정할 수 있다.
class Time {
int hour;
int minute;
int second;
}
public class Test {
public static void main(String[] args){
// 인스턴스 생성
Time t1 = new Time();
// 인스턴스 변수 초기화
t1.hour = 12;
t1.minute = 24;
t1.second = 36;
}
}
위처럼 작성하면 생성과 초기화가 분리되어 있어서 불편합니다.
class Time {
int hour;
int minute;
int second;
Time(int hour, int minute, int second) { // 생성자
this.hour = hour;
this.minute = minute;
this.second = second;
}
}
위처럼 생성자를 작성하면 인스턴스를 생성함과 동시에 인스턴스 변수를 초기화(설정) 할 수 있습니다.
규칙
1. 이름이 클래스 이름과 같아야 한다.
2. 리턴값이 없다.(void를 안붙인다.)
3. 생성자가 하나도 없을 경우 컴파일러가 자동으로기본 생성자
를 만들어 준다.
4. 생성자는 여러 개 만들 수 있다.(단 오버로딩 규칙에 적합할 때)
5.기본 생성자
를 자동으로 만들어 주지만 직접 작성하는 습관을 들이는 것을 추천한다!
class Card {
Card(){} // 매개변수 없는 생성자
Card(String kind, int number){ // 매개변수 있는 생성자
// 인스턴스 초기화 작업
}
}
정의
- 생성자에서 다른 생성자 호출할 때 사용
- 다른 생성자 호출시 첫 줄에서만 사용 가능
목적
- 여러 개의 생성자에 중복된 코드를 없애기 위해서
class Test {
public static void main(String[] args) {
MyCar c1 = new MyCar();
MyCar c2 = new MyCar("black");
MyCar c3 = new MyCar("red", "stick", 2);
System.out.println("c1");
c1.printIV();
System.out.println("c2");
c2.printIV();
System.out.println("c3");
c3.printIV();
}
}
class MyCar {
String color;
String gearType;
int door;
MyCar() {
this("white", "auto", 4); // 생성자 호출( default 값 )
}
MyCar(String color) {
this(color, "auto", 4); // 생성자 호출( 특정 변수 수정 )
}
MyCar(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
void printIV(){
System.out.println("color = " + color);
System.out.println("gearType = " + gearType);
System.out.println("door = " + door);
}
}
>> c1
>> color = white
>> gearType = auto
>> door = 4
>> c2
>> color = black
>> gearType = auto
>> door = 4
>> c3
>> color = red
>> gearType = stick
>> door = 2
MyCar()
MyCar(String color)
에 작성된 this(매개변수1,매개변수2,매개변수3)
은
MyCar(String color, String gearType, int door)
를 뜻합니다.
this()와는 생김새가 비슷할 뿐 완전히 다른 것이다.
정의
- 인스턴스 자신을 가리키는 참조변수
- 인스턴스 메서드(생성자 포함)에서 사용가능
- 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
class Car {
String color;
String gearType;
int door;
Car(String color, String gearType, int door){
// this.변수는 인스턴스 변수 / 변수는 매개변수(지역변수)
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
만약 생성자 안에서 this로 변수를 구분하지 않는다면 매개변수와 인스턴스 변수를 구분하지 못할 것 입니다.
이를 구분하기 위해 인스턴스 변수에 this를 붙입니다.
클래스 변수(cv) 와 인스턴스 변수(iv) 의 초기화 방법은 3가지가 있습니다.
1. 자동 초기화( x )
2. 간단 초기화( = )
3. 복잡 초기화( {}, static {} )
class Data {
int x;
int y = x; // x == 0
void method1() {
int i;
int j = i; // 에러.. 지역변수를 초기화하지 않고 사용
}
}
지역 변수는 직접 초기화(간단 초기화)를 하지 않으면 사용할 수 없다.
반면 cv, iv는 자동으로 초기화 값이 할당되어 사용할 수 있다.
자료형 별 초기화 값
1. 명시적 초기화(=)<단순 초기화>
class Car {
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
}
2. 초기화 블럭<복잡 초기화>
인스턴스 변수 초기화 시점: 인스턴스가 생성될 때 마다
클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 딱 1번(메모리에 올라갈 때)
3. 생성자(iv)<복잡 초기화>
class Test {
static int cv = 1; // 명시적 초기화
int iv = 1; // 명시적 초기화
static { // 클래스 초기화 블럭
cv = 2;
}
{ // 인스턴스 초기화 블럭
iv = 2;
}
Test { // 생성자(iv 초기화)
iv = 3;
}
}
초기화 순서
1. cv -> iv
2. 자동 -> 간단 -> 복잡