1. this
this 키워드는 '미래에 생성될 것이라고 기대되는 해당 클래스의 객체의 주소값'을 저장한 참조 변수이다.
즉 this 키워드는 인스턴스 참조 변수를 의미한다.
인스턴스 참조 변수를 통해 인스턴스 변수와 메서드에 접근이 가능했던 것처럼, this를 통한 접근이 가능하다.
쓰일 수 있는 범위는 해당하는 클래스 내부에서만 가능하다.
왜냐하면 클래스 내부를 벗어나는 순간 this 가 누구를 의미하는 것인지 알 수 없기 때문이다.
this는 this()의 형태로도 존재하는데, ()는 생성자를 의미한다.
즉 자신의 생성자를 의미하는 것으로 이는 생성자 내부에서 다른 생성자를 호출하는 때에 사용할 수 있다.
먼저 this 의 사용 예시를 살펴보자.
class Car{
int door;
String color;
// 기본 생성자
Car(){
}
// 매개변수가 있는 생성자
// this 를 사용하지 못 할 때
Car(int d, String c){
door = d;
color. = c;
}
// this 를 사용했을 때
Car(int door, String color){
this.door = door;
this.color = color;
}
}
this 키워드가 없이 매개변수가 있는 생성자를 사용하면 인스턴스 변수에 해당하는 매개변수의 변수명을 각각 다르게 만들어야 한다.
만일 변수명을 같게 하면 컴파일러는 각각의 변수명이 무엇을 가리키는지 알 수 없어 경고를 보낼 수 있다.
하지만 이렇게 되면 단순히 변수명을 보고 매개변수와 인스턴스 변수 간의 관계 유추가 복잡해질 수 있다는 단점이 생긴다.
이를 해결해주는 것이 바로 this 키워드이다.
this 를 사용해서 인스턴스 변수임을 나타내주고, 이와 같은 변수명으로 매개변수를 나타낼 수 있어진다.
그럼 이번에는 this() 키워드를 사용해보자.
class Car{
int door;
String color;
Car(){
// 매개변수를 두 개 필요로 하는 생성자 호출
this(4, 'white');
}
Car(int door, String color){
this.door = door;
this.color = color;
}
}
이렇게 사용하게 되면 Car()을 호출 시 매개변수 값을 별도로 넣지 않아도
기본 생성자 내부에서 매개변수를 필요로 하는 생성자를 호출해서 활용된다.
또한 this 키워드는 메서드 내부에서도 호출이 가능한데,
인스턴스 메서드 내부에서는 this 키워드가 지역변수로써 숨겨져 있기 때문이다.
2. super
this 키워드가 해당 클래스의 참조 변수를 나타낸 것처럼 super 키워드는 부모 클래스의 참조 변수를 나타낸다.
즉 상속 관계에 있을 경우 활용할 수 있는 키워드이다.
super 가 부모 클래스로부터 생성되는 인스턴스의 주소값을 저장하고 있기 때문에
super 를 통해서 호출할 수 있는 것은 인스턴스 변수와 메서드를 호출할 수 있다.
super() 는 this() 와 동일하게 생성자를 의미한다.
상속 관계에 있는 자식 클래스는 인스턴스를 생성하는 시점에 부모 클래스의 생성자를 호출하여 생성하기 때문에
부모 클래스의 멤버를 활용할 수 있게 된다.
때문에 생성자는 기본적으로 자기 자신의 생성자 또는 부모 생성자를 호출해야 한다.
호출 위치는 항상 첫줄이어야 한다.
그렇지 않으면 생성자로 인한 초기화 과정에서 순서로 인하여 무의미해지는 경우가 생길 수 있기 때문이다.
상속 관계의 자식 클래스에서 부모 클래스의 생성자를 호출한 적이 없는데 가능했던 이유는
컴파일러가 기본적으로 super(); 를 삽입해줬기 때문이다.
다만 기본으로 삽입되는 생성자가 부모 클래스의 기본 생성자이기 때문에
만일 부모 클래스에 기본 생성자가 없는 경우에는 컴파일 에러가 발생하게 된다.
'JAVA' 카테고리의 다른 글
여러 타입의 객체를 하나의 배열로 다루기 (1) | 2022.09.25 |
---|---|
다형성 (0) | 2022.09.24 |
오버라이딩(Overriding) (0) | 2022.09.20 |
클래스 간의 관계 - 상속, 포함 (0) | 2022.09.18 |
오버로딩(Overloading) (0) | 2022.09.17 |