'Super Class'에 해당되는 글 2건

[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()

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



블로그 이미지

필로그래머

,

[Java] 자바 상속과 super() 메서드


2017/05/12 - [java] - [Java] 상속 (inheritance)과 Object 클래스


상속과 super() 메서드

- 상속 받은 클래스의 모든 생성자는 수퍼 클래스의 기본 생성자를 호출한다.

   super();

- 만약 수퍼 클래스의 기본 생성자를 호출하는 코드를 작성하지 않는다면,

  컴파일러가 생성자 블록의 첫 줄에 이 코드를 자동으로 삽입한다.

- 수퍼 클래스의 생성자를 호출하는 코드는 반드시 첫 명령어로 작성해야 한다.

  그 앞에 주석은 



수퍼 클래스의 기본생성자를 호출하는 super() 메서드 예제


public class A {
  int a;
 
  public A() {
//    int a = 20; // 만약 수퍼 클래스의 생성자를 호출하는 코드 앞에 다른 명령이 있다면,
                //   컴파일 오류이다.
    // 반드시 첫 명령어로 이 클래스의 수퍼 클래스 생성자를 호출하는 코드를 작성해야 한다.
    super(); // Object 클래스 생성자 호출
    System.out.println("A()");
  }

}


public class B extends A {
  int b;
 
  public B() {
    super(); // A 클래스 생성자 호출
    System.out.println("B()");
  }
}

public class C extends B {
  int c;
 
  public C() {
    super(); // B 클래스 생성자 호출
    System.out.println("C()");
  }

}




인스턴스 생성 코드


 public static void main(String[] args) {
    new C();   

  }


- 실행결과 :

A()

B()

C()


*참고 : 

 수퍼 클래스(부모 클래스)의 기본 생성자를 호출하는 super() 메서드를 쓰지 않으면

 컴파일러는 자동적으로 추가시킨다.




블로그 이미지

필로그래머

,