본문 바로가기

JAVA

JAVA #23 생성자 this() , 참조 변수 this , 변수의 초기화 , 멤버변수의 초기화

1. 생성자 this()

 

- 생성자에서 다른 생정자 호출할 때 사용

- 다른 생성자 호출시 첫 줄에서만 사용가능

 

class Car2 {
	String color;		//색상
    String gearType;	//변속기 종류 - auto(자동), manual(수동)
    int door;			// 문의 개수
    
    Car2() {
    	this("white","auto",4);
    }
    
    Car2(String color) {
    	this(color, "auto",4);
    
    Car2(String color, String gearType, int door) {
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
     }
  }

 

2. 참조변수 this

 

- 인스턴스 자신을 가리키는 참조변수

- 인스턴스 메서드(생성자 포함)에서 사용가능

- 지역변수 (lv)와 인스턴스 변수(iv)를 구별할 때 사용

 

Car(String c, String g, int d) {
	// color는 iv , c는 lv
    color = c;
    gearType = g;
    door = d;
  }

-> this 생략 가능 (같은 클래스 내에서)

 

Car(String color, String gearType , int door) {
	// this.color는 iv , color lv
    this. color = color;
    this. gearType = gearType;
    this. door = door;
  }

-> iv, lv 구별 해야 되기 때문에 this 생략 불가

 

 

 

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

       모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.

 

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

 

3. 변수의 초기화

- 지역변수(lv)는 수동 초기화(-> 우리가 직접 초기화) 해야함 (사용전 꼭!!!)

- 멤버변수(iv, cv)는 자동 초기화된다.

 

class InitTest {
	int x;		// 인스턴스 변수
    int y = x;	// 인스턴스 변수
    
    void method1() {
    	int i; // 지역 변수
        int j = i; // 에러. 지역변수를 초기화하지 않고 사용
     }
 }

 

4. 멤버변수의 초기화

1) 명시적 초기화 (=)

    class Car {

            int door = 4;                   // 기본형(primitive type) 변수의 초기화

            Engine e = new Engine();   // 참조형(reference type) 변수의 초기화

 

2) 초기화 블럭

    인스턴스 (iv) 초기화 블럭 : { }

    클래스 (cv) 초기화 블럭 : static { }

 

3) 생성자

    Car (String color, String gearType, int door) { // 매개변수있는 생성자

              this. color = color;

              this. gearType = gearType;

              this. door = door;

 

멤버변수의 초기화 - static { }

 

1) 명시적 초기화 (=)

2) 초기화 블럭 - { }, static { }

3) 생성자(iv 초기화)

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

 

 

멤버변수의 초기화

 

- 클래스 변수 초기화 시점: 클래스가 처음(메모리에 올라갈 때) 로딩될 때 단 한번

- 인스턴스 변수 초기화 시점: 인스턴스가 생설될 때 마다

 

class InitTest {
	static int cv = 1; // 명시적 초기화
    int iv = 1;		   // 명시적 초기화
    
    static { cv = 2; } // 클래스 초기화 블럭
    { iv = 2; } 	   // 인스턴스 초기화 블럭
    
    InitTest() { 	   // 생성자
    	iv = 3;
     }
  }
  
  InitTest it = new InitTest(); // 복잡 초기화

 

초기화 순서 : 1. cv -> iv

                  2. 자동(0) -> 간단(=) -> 복잡

 

 

클래스 초기화 인스턴스 초기화
기본값 명시적 초기화 클래스 초기화블럭 기본값 명시적 초기화 인스턴스 초기화 블럭 생성자
cv 0 
자동
cv 1
간단(=)
cv 2
복잡(static {} )
cv 2
iv 0
cv 2
iv 1
cv 2
iv 2
cv 2
iv 3
1 2 3 4 5 6 7