Java - 참조변수 super

춤추는개발자·2022년 11월 22일
0

Java 정리

목록 보기
11/59

참조변수 super

  • 객체 자신을 가리키는 참조변수, 인스턴스 메서드(생성자)내에만 사용 가능하고 static 메서드 내에서는 사용 불가 합니다.
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용 합니다.

참조변수 super java 예시 코드

부모,자식 클래스에 중복되는 변수가 있을 때

class Parent {
    int x = 10; // super.x
}
class Child extends Parent{
    int x = 20; // this.x

    void method(){
        System.out.println("x = "+x);
        System.out.println("this.x = "+this.x);
        System.out.println("super.x = "+super.x);
    }
}
public class JavaExercise_33 { // 참조변수 super 실습 (부모,자식 클래스에 중복되는 변수가 있을 때)
    public static void main(String[] args) {
        Child child = new Child();
        child.method();

    }
}
출력 결과 : 
x = 20
this.x = 20
super.x = 10

부모, 자식 클래스에 중복되는 변수가 있을때 부모 클래스의 변수를 사용하려면 super 참조변수를 사용해야 합니다.

부모,자식 클래스에 중복되는 변수가 없을때

class Parent2 {
    int x = 10; // super.x , this.x 둘다 가능, x가 하나없기 때문
}
class Child2 extends Parent{
    void method(){
        System.out.println("x = "+x);
        System.out.println("this.x = "+this.x);
        System.out.println("super.x = "+super.x);
    }
}
public class JavaExercise_34 { // 참조변수 super 실습2 (부모,자식 클래스에 중복되는 변수가 없을때)
    public static void main(String[] args) {
        Child2 child2 = new Child2();
        child2.method();

    }
}
출력결과 : 
x = 10
this.x = 10
super.x = 10

부모, 자식 클래스에 중복되는 변수가 없을때 그 변수를 사용하려면 x,this,super 참조변수 모두 사용 가능 합니다.

생성자 super()

  • 조상의 셍성자를 호출할 때 사용
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화, 조상의 멤버를 어떻게 초기화 해야할지 제일 잘 아는건 조상이기 때문이다.
  • 참조변수 super와는 관계가 없다.
  • 생성자의 첫 줄에 반드시 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super()를 넣는다.
class Point { 
     int x;
     int 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 "x : "+x+", y : "+y+", z : "+z;
       }
      
 }

위의 코드를 작성하고 main에서 Point3D 인스턴스를 생성하면 에러가 발생한다. 이유가 무엇일까? 위에서 공부했던 생성자의 첫줄에 반드시 생성자를 넣어야 한다는 규칙에 의해서 에러가 발생한 것이다.

Point(int x, int y) {
          super()  // object 클래스의 super 생성자 
          this.x = x;
          this.y = y;
     }
     
 Point3D(int x, int y, int z) {
          super() // 여기서 에러 발생 
          this.x = x;
          this.y = y;
          this.z = z;
     }

위의 코드를 보면 우리가 생성자를 넣어주지 않았기 때문에 컴파일러는 자동으로 super() 생성자를 넣어주게 된다. 인스턴스를 생성하면 Point 생성자에는 조상인 object 클래스의 super() 생성자가 자동으로 만들어지고 Point3D 생성자에도 super() 생성자가 만들어진다. 하지만 여기서 만들어지는 super() 생성자는 object 클래스의 생성자가 아닌 부모인 Point 클래스의 생성자의 super() 가 만들어지는 것이다. 하지만 Point 클래스에는 Point() 생성자가 없기 때문에 에러가 발생한다.
에러를 해결하는 방법은 Point 클래스에 Point() 생성자를 만들거나 Point3D 클래스 생성자에 super(x,y) 생성자를 넣어주면 됩니다.

클래스를 만들 때 기본 생성자는 필수로 만들어 주어야 한다.

0개의 댓글