2023/09
super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. 멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버 이름이 같을 때에는 super를 붙여서 구별할 수 있다.
class SuperTest {
public static void main(String args[]){
Child c = new Child();
c.method();
}
}
class Parent {
int x=10;
}
class Child extends Parent{
void method{
System.out.println("x=" + x); //x=10
System.out.println("this.x=" + this.x); //this.x=10
System.out.println("super.x=" + super.x); //this.x=10
}
}
class SuperTest2{
public static void main(String args[]){
Child c = new Child();
c.method();
}
}
class Parent{
int x = 10;
}
class Child extends Parent{
int x = 20;
void method(){
System.out.println("x=" + x); //x=20
System.out.println("this.x=" + this.x); //this.x=20
System.out.println("super.x=" + super.x); //this.x=10
}
}
같은 이름의 멤버변수가 조상 클래스인 Parent에도 있고 자손 클래스인 Child클래스에도 있을 때는 super.x와 this.x는 서로 다른 값을 참조하게 된다.
super.x는 조상 클래스로부터 상속받은 멤버변수 x를 뜻하며, this.x는 자손 클래스에 선언된 멤버변수를 뜻한다.
이처럼 조상 클래스에 선언된 멤버변수와 같은 이름의 멤버변수를 자손 클래스에서 중복 정의하는 것이 가능하며, 참조변수 super를 이용해서 서로 구별할 수 있다.
변수만이 아니라 메서드 역시 super를 써서 호출할 수 있다. 특히 조상 클래스의 메서드를 자손 클래스에서 오버라이딩 한 경우에 super를 사용한다
class Point {
int x;
int y;
String getLocation(){
return "x :" + x + "y :" + y;
}
}
class Point3D extends Point{
int z;
String getLocation(){ //오버라이딩
//return "x :" + x + ",y :" + y, ",z :" + z;
return super.getLocation() + ", z:" + z; //조상의 메서드 호출
}
}
접근제어자는 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다
접근제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
private - 같은 클래스 내에서만 접근이 가능하다
protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다
default - 같은 패키지 내에서만 접근이 가능하다 (패키지에 관계 없이 상속 관계에 있는 자손 클래스에서 접근할 수 있도록 하는 것이 제한 목적이지만, 같은 패키지 내에서도 접근이 가능하다. 그래서 protected가 default보다 접근 범위기 더 넓다)
public - 접근 제한이 전혀 없다
public class Time {
private int hour;
private int minute;
private int second;
public int getHour(){
return hour;
}
public void setHour(int hour){
if(hour<0 || hour23) return;
this.hour = hour;
}
public int getMinute(){
return minute;
}
public void setMinute(){
if(minute < 0 || minute > 59) return;
this.minute = minute;
}
public int getSecond(){
return second;
}
public void setSecond(){
if(second < 0 || second > 59) return;
this.second = second;
}
}
class Car {
String color;
int door;
void drive(){ //운전하는 기능
System.out.println("drive, Brrr~~~");
}
void stop(){ //멈추는 기능
System.out.println("stop!!!");
}
}
class FireEngine extends Car { //소방차
void water(){ //물 뿌리는 기능
System.out.println("water!!!");
}
}
class Ambulance extends Car { //앰뷸런스
void water(){ //사이렌을 울리는 기능
System.out.println("siren~~~");
}
}
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null
car = fe; //car = (Car)fe;에서 형변환 생략됨. 업캐스팅
fe2 = (FireEngine)car //형변환 생략 불가. 다운캐스팅