[Java] 자바 super 키워드의 사용


super 키워드

- 재정의 하기 전(부모)의 메서드를 호출할 때 사용한다.

- 많은 신입 분들이 super가 수퍼 클래스를 가리키는 것이라고 오해를 한다.

- 정의

   1) 자신을 뺀 조상 클래스에서 메서드를 찾는다.

   2) 그 중 가장 가까이에 있는 메서드를 가리킨다.



m1(), m2(), m3() 메서드를 가진 A class 예제


public class A {

  int a;
 
  public void m1() {
    System.out.println("A.m1()");
  }
 
  public void m2() {
    System.out.println("A.m2()");
  }
  public void m3() {
    System.out.println("A.m3()");
  }
}


m1(), m2() 메서드를 재정의 하고 m4() 메서드를 추가한 B class 예제

public class B extends A{

  int b;
 
  public void m1() { // A클래스의 m1() 재정의
    System.out.println("B.m1()");
  }
 
  public void m2() { // A클래스의 m2() 재정의
    System.out.println("B.m2()");
  }
  public void m4() { // 새로 추가
    System.out.println("B.m4()");
  }
}


B의 m2() 메서드와 A의 m3() 메서드를 재정의한 C class 예제

public class C extends B{

  int c;
 
  public void m2() { // B클래스의 m2() 재정의
    System.out.println("C.m2()");
  }
 
  public void m3() { // A클래스의 m3() 재정의
    System.out.println("C.m3()");
  }
 
  public void m5() { // 새로 추가
    System.out.println("C.m4()");
  }
  public void test1() {
    m1(); // B.m1()
    m2(); // C.m2()
    m3(); // C.m3()
  }
  public void test2() {
    super.m1(); // B.m1() <-- 재정의 하지 않았으면 상속 받은 메서드를 가리킨다.
                //            super는 무시된다.
    super.m2(); // B.m2()
    super.m3(); // A.m3()
    m4();       // B.m4()
    super.m4(); // B.m4(); <-- 재정의 하지 않았으면 super는 무시된다.
    m5();       // C.m5();
//    super.m5(); // 재정의하거나 상속 받은 메서드가 아니기 때문에, 컴파일 오류!
                // 조상 중에 m5() 메서드가 없다.
  }
}



인스턴스 생성 및 메서드 호출 코드


public static void main(String[] args) {

    C obj = new C();
    obj.test1();
    System.out.println("------------------------------");
    obj.test2();
    System.out.println("------------------------------");
}

- 실행 결과 :

B.m1()

C.m2()

C.m3()

------------------------------

B.m1()

B.m2()

A.m3()

B.m4()

B.m4()

C.m4()

------------------------------



블로그 이미지

필로그래머

,