Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

생성자 this()와 참조변수 this 본문

Java/객체지향

생성자 this()와 참조변수 this

빌드이너프 2023. 6. 1. 18:36

생성자 this()

같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다

생성자에서 다른 생성자 호출

코드 중복제거하기 위해 생성자간 호출함

this에 괄호()가 없이 this만 있다면 참조변수이다, this() ≠ this

 

생성자 간의 호출이 가능한 조건

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

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

(생성자 내에서 초기화 작업도중에 다른 생성자를 호출하면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화할 것이고 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문)

 

두 가지 조건을 모두 만족하지 못한 코드

Car(String color) {
    door = 5;
    Car(color, "auto", 4);
}

// 생성자의 두 번째 줄에서 다른 생성자 호출
// tihs(color, "auto", 4);로 해야됨

 


코드의 중복을 제거하지 못한 코드

사용가능하긴 함, 하지만 중복됨

class Car {
    String color;
    String gearType;
    int door;

    Car() { // 디폴트 값
        color = "white";
        gearType = "auto"
        door = 4;
    }
    
    Car(String c, String g, int d) { // 위의 Car() {...}와 비슷함 => 코드의 중복
        color = c;
        gearType = g;
        door = d;
    }   
}

 

코드의 중복을 제거한 코드

처음나온 Card() 생성자에서 두 번째의 Card() 생성자를 호출해야 함

class Car {
    String color;
    String gearType;
    int door;

    Car() { // Car(String c, String g, int d)를 호출
        // Card("white", "auto", 4);
        this("white", "auto", 4);
    }
    
    Car(String c, String g, int d) {
        color = c;
        gearType = g;
        door = d;
    }   
}

참조변수 this

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

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

지역변수(local variable)와 인스턴스 변수(instance variable)를 구별할 때 사용

this에 괄호()가 없이 this만 있다면 참조변수이다, this ≠ this()

 

 

지역변수(local variable)와 인스턴스 변수(instance variable) 구별

this는 생략된 것임(같은 클래스 안에서 생략 가능)

Car(String c, String g, int d) {
    // this. 생략됨
    color = c; // iv, this.color = c;
    gearType = g; // iv, this.gearType  = g;
    door = d; // iv, this.door = d;
}

 

this.color처럼 this가 붙은 것은 iv,  = color;에 color은 lv(local variable)

this가 생략되지 못하는 이유는 이름이 같기 때문(iv와 lv가 이름이 같다

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

생성자 this()와 참조변수 this 정리

this(), this(매개변수) this
생성자, 같은 클래스의 다른 생성자를 호출할 때 사용 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다
모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다

 

생성자, 인스턴스 메서드 this 사용가능

static 메서드(클래스 메서드)는 this 사용 불가능

(static 메서드는 인스턴스를 생성하지 않고도 호출될 수 있고 static메서드가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문)

class MyMath2 {
    long a, b // this.a    this.b
    
    MyMath2(int a, int b) { // 생성자, int a와 int b는 lv
        this.a = a; // this 생략 불가(이름이 같기 때문)
        this.b = b; // this 생략 불가(이름이 같기 때문)
    }
    
    long add() { // 인스턴스 메서드
        return a + b; // iv, this 생략 가능
    }
    
    static long add(long a, long b) { // 클래스 메서드(static 메서드)
        return a + b;
        // 클래스 메서드에서는 this, iv 사용불가
    }
}

 

코드

class Car {
    String color;
    String gearType;
    int door;

    Car() {
        this("white", "auto", 4);
    }

    Car(String color) {
        this(color, "auto", 4);
    }

    Car(String color, String gearType, int door) {
        this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

class CarTest {
    public static void main(String[] args) {
        Car c1 = new Car();
        Car c2 = new Car("blue", "autoo", 5);

        System.out.println(c1.color +" "+  c1.gearType +" "+ c1.door);
        System.out.println(c2.color +" "+  c2.gearType +" "+ c2.door);
    }
}

white auto 4
blue autoo 5

'Java > 객체지향' 카테고리의 다른 글

상속(Inheritance)  (0) 2023.06.04
변수의 초기화  (0) 2023.06.01
생성자 Constructor  (0) 2023.06.01
오버로딩 overloading  (0) 2023.05.30
class 메서드(static 메서드)와 instance 메서드  (0) 2023.05.30