언어/Java

190223 생성자

닥스훈스 2019. 2. 3. 01:41

생성자에서 다른 생성자를 호출할때,

1. 생성자의 이름으로 클래스이름 대신 this를 사용한다.

2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫줄에서만 호출이 가능하다.

public class ex {
	public static void main(String[] args) {
		Car c1=new Car();
		System.out.println(c1.color+c1.gearType+c1.door);
		Car c2=new Car("red");
		System.out.println(c2.color+c2.gearType+c2.door);
	}
}

class Car{
	String color; //색상
	String gearType; //변속기종류
	int door; //문의개수
	
	Car(){ //Car(String color, String gearType, int door)를 호출
		this("white","auto",4);
	}; //기본생성자
	
	Car(String color){
		this.color=color;
	}
	
	Car(String color, String gearType, int door){
		this.color=color;
		this.gearType=gearType;
		this.door=door;
	}
}


this 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어있다.

this(),this(매개변수) 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.



생성자를 이용한 인스턴스의 복사

클래스의 참조변수를 매개변수로 선언하여 복사한다.


public class ex {
	public static void main(String[] args) {
	Car c1=new Car();
	Car c2=new Car(c1); //c1의 복사본 c2를 생성한다.
	System.out.println(c1.color+c1.gearType+c1.door);
	System.out.println(c2.color+c2.gearType+c2.door);
	c1.door=100; 
	//c1의 인스턴스 변수 door 변경 후
	System.out.println(c1.color+c1.gearType+c1.door);
	System.out.println(c2.color+c2.gearType+c2.door);
	
	}
}

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;
	}
}

변수의 초기화

인스턴스변수: 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어짐
지역변수: 사용하기 전에 자동적으로 반드시 초기화해야 한다.

인스턴스변수의 초기화 방법
1.명시적 초기화: 변수를 선언과 동시에 초기화하는 것
Class Car{
int door=4; //기본형 변수의 초기화
Engine e=new Engine(); //참조형 변수의 초기화
//...

2.초기화블럭

-클래스 초기화 블럭: 클래스변수의 복잡한 초기화에 사용된다. static{...{

-인스턴스 초기화 블럭: 인스턴스변수의 복잡한 초기화에 사용된다. {...}

클래스변수는 클래스가 메모리에 처음 로딩될 때 한번만 수행되며, 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다.


public class ex { public static void main(String[] args) { System.out.println("BlockTest bt=new BlockTest();"); BlockTest bt=new BlockTest(); System.out.println("BlockTest bt2=new BlockTest();"); BlockTest bt2=new BlockTest(); } } class BlockTest{ static { System.out.println("static{ }"); //클래스 초기화 블럭 } { System.out.println("{ }"); //인스턴스 초기화 블럭 } BlockTest(){ System.out.println("생성자"); } }