Super

Kongsub·2020년 7월 28일
0

JAVA

목록 보기
10/15
post-thumbnail

Super

: 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다.
멤버 변수와 지역 변수의 이름이 같을 때, "this"를 붙여 구별했듯이 상속받은 멤버와 자신의 멤버와 이름이 같은 경우, "super"를 붙여 구분한다.
Ex code

class SuperTest{
	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);
        System.out.println("this.x=" + this.x);
        System.out.println("super.x=" + super.x);
    }
}	

실행 결과
x=20
this.x=20
super.x=10

다음 코드처럼, 조상클래스의 메서드를 자식클래스의 메서드가 오버라이딩한 경우에도 "super"를 사용한다.
Ex code

class Point {
	int x;
    int y;
    
    String getLocation(){
    	return "x :" + x + ", y :" + y ;
    }
}

class Point3D extends Point {
	int z;
    
    String getLocation(){		//오버라이딩 
    	return super.getLocation() + ", z : " + z;
    }
}

super() - 조상 클래스의 생성자

: Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자.this() or super()를 호출해야한다.
그렇지 않으면 컴파일러가 자동적으로 "super();"를 생성자의 첫줄에 삽입한다.

다음의 코드를 보자

class PointTest{
	public static void main(String args[]){
    	Point3D p3 = new Point3D(1,2,3);
    }
}

class Point {
	int x, y;
    
    Point(int x, int y){
    	this.x = x;
        this.y = y;
    }
    
    String getLocation() {
    	return "x :" + x + ", y :" + y;
    }
}

class Point3D extends Point {
	int z;
    
    Point3D(int x, int y, int z){
    	this.x = x;
        this.y = y;
        this.z = z;
    }
    
    String getLocation() {
    	return super.getLocation() + ", z: " + z ;
    }
}

위의 예제를 실행하면 컴파일 에러가 발생할 것이다.
바로 Point3D클래스의 생성자에서 조상 클래스의 생성자인 Point()를 찾을 수 없다는 에러이다.
왜냐하면 컴파일러는 자동적으로 자식 클래스 생성자 맨 첫줄에 "super();"을 넣어 컴파일 하는데, 조상 클래스에 "super();" 생성자가 정의되지 않았기 때문이다.

따라서 코드를 다음과 같이 수정한다.

class PointTest{
	public static void main(String args[]){
    	Point3D p3 = new Point3D(1,2,3);
    }
}

class Point {
	int x, y;
    
    Point(int x, int y){
    	this.x = x;
        this.y = y;
    }
    
    String getLocation() {
    	return "x :" + x + ", y :" + y;
    }
}

class Point3D extends Point {
	int z;
    
    Point3D(int x, int y, int z){
    	this(100,100,100);
    }
    
    Point3D(int x, int y, int z){
    	super(x,y);
        this.z = z;
    }
    
    String getLocation() {
    	return super.getLocation() + ", z: " + z ;
    }
}

" Point3D p3 = new Point3D(); " 을 실행하여
Point3D의 인스턴스가 만들어지면, 생성자는 다음과 같은 순서로 호출되어 진다.
Point3D() -> Point3D(int x, int y, int z) -> Point(int x, int y) -> Object()

profile
심은대로 거둔다

0개의 댓글