충분히 쌓여가는
생성자 this()와 참조변수 this 본문
생성자 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 |