티스토리 뷰

반응형

 

🤔 생성자 this()란?

생성자에서 다른 생성자를 호출할 때 사용한다.

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

 

다음의 예시를 살펴보자.

Car(String color) {
	door = 5;
    Car(color, "auto", 4); // 에러, 다른 생성자 호출 시 반드시 첫 줄에서만 사용가능!!
    // 또한 같은 클래스 안의 생성자를 호출할 때 Car(color, "auto", 4); 로 호출하면 안되고
    // this 사용해야함.
}

// 올바른 사용법
Car(String color) {
	this(color, "auto", 4);
}

 

🤔 참조변수 this란?

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

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

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

 

참조 변수 this

this.이 붙은 변수들은 인스턴스 변수이고,

= 뒤의 변수(흰색)은 지역변수이다.

 

⭐ 이렇게 지역변수와 인스턴스 변수를 구분 지을 때 '참조변수 this'를 사용한다❗❗

 

만약 여기서 참조변수 this를 사용하지 않으면 어떨까?

color = color;

gearType = gearType;

door = door;

이렇게 작성했다면 둘다 지역변수가 될 것이다.

(가까운 위치의 변수값을 사용하기 때문)

 

➕ 그럼 또 한가지 질문이 있을 것이다!

지역변수와 인스턴스 변수의 이름이 다르다면?

 

다음의 코드를 보자.

Car2(String c, String g, int d) { // lv(local variable)
    this.color = c;
    this.gearType = g;
    this.door = d;
}

Car2(String c, String g, int d) {
    color = c;
    gearType = g;
    door = d;
}

지역변수와 인스턴스 변수의 이름이 다르다면

위의 방식처럼 this를 써도 되고

아래의 방식처럼 this를 생략 가능하다.

 

 

 

 

 

📌 this()와 this의 차이란?

this와 this()의 차이

 

this와 this()는 완전히 다르다!

this는 '참조 변수'이고,

this()는 '생성자' 이다!

 

 

❌ static 메서드에서 this 사용 불가하다.

다음의 코드를 보자.

class MyMath {
    long a, b; // this.a, this.b가 iv의 진짜 이름이다.

    MyMath(int a, int b) { // 생성자
        this.a = a;
        this.b = b; // 무조건 this 사용해야함. 왜냐? iv와 lv이름 같으니까!
    }

    long add() { // 인스턴스 메서드
        return a + b; // return this.a + this.b; // 생략가능(왜냐? iv 사용하니까)
    }

    /**
     * 생성자, 인스턴스 메서드에서 this 사용 가능
     * static 메서드에선 this 사용 불가
     */

    static long add(long a, long b) { // 클래스 메서드(static 메서드)
        return a + b; // this 사용 불가능
        /**
         * static 메서드에서는 this사용 불가, iv 사용불가
         * 왜냐? this는 객체를 의미하는데 객체가 있을 수도 없을 수도 있으니까 사용불가
         * iv도 객체 생성 후 사용할 수 있는게 객체가 있을 수도 없을 수도 있으니까 사용불가
         */
    }
}

 

 


 

🤔 변수의 초기화란?

지역변수(iv)의 경우 수동으로 초기화 해주어야 한다.

멤버변수(iv, cv)의 경우 자동 초기화된다.

 

자료형 기본값 출처 : 자바의 정석 남궁성 강의

 

 

✅ 멤버변수 초기화의 종류 

1. 명시적 초기화(=)

선언시 =(대입연산자) 사용

class Car {
	int door = 4; // 기본형(primitive type) 변수 초기화
    Engine e = new Engine(); // 참조형(reference type) 변수 초기화

 

2. 초기화 블럭

복잡한 초기화(여러 문장)

인스턴스 초기화 블럭 : {}

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

 

3. 생성자

iv 초기화, 복잡한 초기화

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

 

 

 

✅ 멤버변수의 초기화 시점

✔ 클래스 변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한 번

(메모리에 올라갈 때)

 

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

 

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

 

출처 : 자바의 정석 남궁성 강의

 

 

 


다음 포스팅은 자바의 정석 Ch 7장으로 돌아오겠다.

그럼 오늘도 열공하자 🔥 

반응형