ReactJS: constructor()


Q. constructor() 사용 시에 super() 메서드를 사용해야 하는 이유 

- 'this' is not allowed before super() error 



A.  http://cheng.logdown.com/posts/2016/03/26/683329

블로그 이미지

필로그래머

,

[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() 메서드를 쓰지 않으면

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




블로그 이미지

필로그래머

,

[Java] 자바 오버라이딩 (overriding)과 super 키워드


오버라이딩 (overriding)

- 수퍼 클래스 (super cass)의 메서드를 재정의 하는 방법

- 서브 클래스의 조건에 맞춰서 기능을 바꾸는 것이 목적이다.



수퍼 클래스 예제


public class Student {
  String name;
  int age;
 
  void print() {
//원칙    System.out.printf("이름 : %s\n", Student.this.name);
    System.out.printf("이름 : %s\n", name);
    System.out.printf("나이 : %d\n", age);
  }

}




서브 클래스 예제


public class BitStudent extends Student{

  String school;
 
  void print() {
    // 수퍼 클래스의 메서드를 재정의 할 때
    // 기존 코드를 복사/붙여넣기 하는 대신
    // 재정의하기 전의 기존 메서드를 호출하는 것이 편하다.
    /*
    System.out.printf("이름: %s\n", name);
    System.out.printf("나이: %d\n", age);
    */
    // 재정의 하기 전의 메서드를 가리키기 위해
    // (주의! 수퍼 클래스라는 의미가 아니다!)
    // super라는 키워드를 사용하여 메서드를 호출한다.
    super.print(); // 이 메서드를 재정의하기 전의 메서드를 호
    System.out.printf("학교: %s\n", school);
  }
}


호출 코드


public static void main(String[] args) {
    BitStudent s = new BitStudent();
    s.name = "홍길동";
    s.age = 20;
    s.school = "비트대학교";
    s.print();
}


* super (주의 : 수퍼 클래스라는 의미가 아니다.)

- 수퍼 클래스의 메서드를 재정의할 때 기존 코드를 복사/붙여넣기 하는 대신

  재정의하기 전의 기존 메서드를 호출하는 것이 편하다. 재정의 하기 전의 메서드를

  가리키기 위해 super 라는 키워드를 사용하여 메서드를 호출한다.



* 참고

오버로딩 (overloading)

- 클래스 내에 동일한 이름을 가진 메서드를 여러 개 만들어 파라미터의 개수만 달리

  하는 방법이다

- 메서드의 일관성을 유지하는 것이 목적이다.



블로그 이미지

필로그래머

,