Programming/Java, Spring

[JAVA] 참조변수 super & 생성자 super

Juun 2022. 5. 24. 15:24
반응형

자바 객체지향을 공부하다보면 상속을 배우고 상속을 배우다 보면 super라는 개념이 나온다.

처음에 볼때 이게 뭐지? 라는 생각이 드는 생소한 개념이지만 앞선 포스팅의 this와 유사하니 참고 하면 좋을것 같다!

2022.05.14 - [Programming/Java] - [JAVA] this()와 this 의 차이점!

 

[JAVA] this()와 this 의 차이점!

this()와 this 의 차이점! 우리는 자바를 공부하다보면 this()와 this를 볼 수 있는데 처음에는 '이게 같은건가?'라는 생각을 할 수 있지만 엄연히 둘은 전혀 관계가 없는 생성자와 참조변수이다! this( )

puenti.tistory.com


참조변수 super

  • this : 인스턴스 자신을 가르키는 참조변수, lv와 iv를 구별하는데 사용
  • super : this와 같음. 조상의 멤버와 자신의 멤버를 구별하는데 사용
  • 조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점을 제외하고는 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);
    	System.out.println("this.x=" + this.x);
	System.out.println("super.x=" + super.x);
    }
}

위 코드의 결과는

x=10

this.x = 10

super.x = 10

x, this.x, super.x 모두 같은 변수를 의미하므로 모두 같은 값이 출력되었다.

 

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

결과

x=20

this.x=20

super.x=10

 

superTest 예제와 달리 같은 이름의 멤버변수(int x)가 조상 클래스인 Parent도 있고 자손 클래스인 Child 클래스에도 있다.

super.x와 this.x는 서로 다른 값을 참조하게 되는데 super.x는 조상 클래스로부터 상속받은 멤버변수 x 이며,

this.x는 자손 클래스에 선언된 멤버변수를 뜻한다


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

  • 자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
  • 조상의 멤버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.

Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자를 호출해야 한다.

그렇지 않으면 컴파일러가 자동적으로 super(); 를 생성자의 첫 줄에 삽입한다.

 

인스턴스를 생성할 때는 클래스를 선택하는 것만큼 생성자를 선택하는 것도 중요하다!!!

  1. 클래스 : 어떤 클래스의 인스턴스를 생성할 것인가?
  2. 생성자 : 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?
class PointTest2{
	public static void main(String args[]) {
    	Point3D p3 = new Point3D();
        Systme.out.println("p3.x=" + p3.x);
        Systme.out.println("p3.y=" + p3.y);
        Systme.out.println("p3.z=" + p3.z);
    }
}

class Point {
	int x=10;
    int y=20;
    
    Point(int x, int y) {
    	
        this.x = x;
        this.y = y;
    }
}

class Point3D extends Point{
	int z = 30;
    
    Point3D() {
    	this(100, 200, 300);	// Point3D(int x, int y, int z)를 호출
    }
    
    Point3D(int x, int y, int z){
    	super(x, y);		// Point(int x, int y)를 호출
        this.z = z;
    }
}

결과

p3.x=100

p3.y=200

p3.z=300

 

호출 순서

Point3D() → Point3D(int x, int y, int z) → Point(int x, int y) → Object()

반응형