6장 생성자와 초기화

slee2·2021년 9월 5일
0

Java의 정석

목록 보기
9/28
post-thumbnail

생성자

  • 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
  • 인스턴스 생성시 수행할 작업(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);

생성자 this()

  • 생성자에서 다른 생성자 호출할 때 사용
  • 다른 생성자 호출시 첫 줄에서만 사용가능
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;
    }
}

참조변수 this

  • 인스턴스 자시을 가르키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서 사용가능
  • 지역변수(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으로 초기화하지않고 새로운 값을 계속 덮어쓰는 방식을 쓰다보니 따로 초기화를 시키지않고 사용하면 오류가 뜬다.

멤버변수의 초기화

1. 명시적 초기화(=)

선언시 대입연산자(=)를 사용하는것.

class	Car {
	int	door = 4;
    Engine	e = new Engine();
}

2. 초기화 블럭

  • 인스턴스 초기화 블럭 : {}
  • 클래스 초기화 블럭 : 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;
        }
    }
}

3. 생성자(iv 초기화)

초기화 시점

클래스 변수 초기화 시점

  • 클래스가 처음 로딩될 때 단 한번
    인스턴스 변수 초기화 시점
  • 인스턴스가 생성될 때마다

0개의 댓글