본문 바로가기

자바의 정석 정리

자바의 정석 - 7.4 오버라이딩

7.4.1 오버라이딩(overriding)

  • 상속받은 메서드의 내용 변경
  • 부모 클래스 내부에 존재하는 메소드를 상속 받아 자손에서 재정의
class Shape{
    void shapeMethod(){}
}
class Cycle extends Shape{
    void shapeMethod(){
        System.out.println('hi');
    }
}

7.4.2 오버라이딩 조건

  1. 이름이 같이야 한다.
  2. 매개변수가 같아야 한다.
  3. 변환타입이 같아야 한다.
  4. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
class Parent{
    void method(){}
}
class Child extends Parent{
    public void method(){}
}

//Error
class Child extends Parent{
    private void method(){}
}
  1. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
class Parent{
    void parentMethod() throws IOException, SQLException{}
}
class Child extends Parent{
    void parentMethod() throws IOException{}
}

//Error
//Exception은 모든 예외의 조상이므로 예외의 개수가 더 많다.
//단순히 선언된 예외의 문제가 아니라 실제 예외의 개수로 판단해야 한다.
class Child extends Parent{
    void parentMethod() throws Exception{}
}
  1. 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

7.4.3 super

  • 오버라이딩한 자식 클래스 멤버에서 부모 클래스의 멤버를 가져올 때 사용
  • 멤버를 상속 받으면 자식 클래스에서도 멤버이브로 자식 클래스에서 this로 호출가능. 때문에 멤버가 중복되어 정의되어 있을 경우 super로 부모의 멤버를 가져온다.
  • 인스턴스 메서드는 자신이 속한 인스턴스의 주소가 지역변수로 저장이 되는데, 이것이 '참조변수'인 this와 super의 값이 된다.
  • this와 마찬가지로 인스턴스 메서드에서만 사용할 수 있다.(static은 불가)
class Parent{
    void A(){
        int x = 2;
    }
}
class Child extends Parent{
    void A(){
        super.x; //Parents의 A의 x호출호출
    }
}

7.4.4 super()

  • this()와 마찬가지로 생성자이다.
  • 상속을 받으면 부모의 멤버를 사용할 수있게 부모의 '생성자'를 호출하여 부모의 멤버를 초기화함
  • 자식의 생성자 첫 줄에서 부모의 생성자를 호출하지 않았을 경우 컴파일러가 자동으로 super()를 추가함
class Point{
    Point(){} 
    Point(int x){}
}
class Point3D extends Point{
    Point(int x, int y){
        //super();
    }
}
/*
컴파일러가 super();를 삽입함 여기서 super()은 Point()임
Point클래스에서 Point(){}를 선언하지 않았으면 오류
이미 생성자가 생성되었기 때문에 기본 생성자가 만들어지지 않아 오류남 
*/

'자바의 정석 정리' 카테고리의 다른 글

자바의 정석 - 7.6 Import  (0) 2022.06.13
자바의 정석 - 7.5 패키지  (0) 2022.06.13
자바의 정석 - 7.3 Object 클래스  (0) 2022.06.13
자바의 정석 - 7.2 단일상속  (0) 2022.06.13
자바의 정석 - 7.1 상속  (0) 2022.06.13