오버라이딩(overriding)

HYUNBIN CHO·2021년 6월 28일
0

java

목록 보기
15/23
post-thumbnail

🔷 오버라이딩이란

조상클래스로부터 상속받은 메서드의 내용을 변경하는 것. 쉽게 말해 자신에게 알맞게 덮어쓰는 것

🔷 조건

🔸 오버라이딩 하는 자식 클래스의 메서드는
- 조상클래스의 메서드와 이름이 같아야 하고
- 매개변수가 같아야 하며
- 반환타입이 같아야 한다.

🔸 접근제어자와 예외
- 접근 제어자는 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다. (public > protected > default > private)
- 조상클래스의 메서드보다 더 많은 예외를 선언할 수 없다.
- 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

🔷 오버로딩 vs 오버라이딩

🔸 오버로딩 : 이름이 같은 '새로운' 메서드를 정의하는 것.
🔸 오버라이딩 : 상속받은 메서드의 내용을 '변경'하는 것.

class Parent{
    void parentMethod();
}
class Child extends Parent{
    void parentMethod(){} // 오버라이딩
    void parentMethod(int i){} // 오버로딩
   
    void childMethod(){}
    void childMethod(int i){} // 오버로딩
   
}

🔷 super와 super()

🔸 super : 상속받은 멤버를 참조하는데 사용되는 참조변수, 조상의 멤버와 자신의 멤버를 구별하는 데 사용한다.
( this와 같은 개념)

class Super{
    public static void main(String args[]){
        Child c= new Child();
        c.method();
    }
}
class Parent{
    int x = 10; // super.x
}
class Child extends Parent{
    int x = 20; // this.x
    void method(){
        System.out.println("x = " + x); // x = 20
        System.out.println("this.x = " + this.x); // this.x = 20
        System.out.println("super.x = " + super.x); // super.x = 10
    }
}
* 주로 조상클래스의 메서드를 자식클래스에서 오버라이딩한 경우, 조상클래스의 멤버변수와 자손클래스의 멤버변수명이
  중복 될 경우에 사용한다.

🔸 super() : 조상클래스의 생성자( *. this()와 같은 개념 )
- 조상클래스의 생성자를 호출해야 하는 이유 : 자식클래스에서 조상클래스의 멤버를 사용할 수도 있는데 사용하기 전에 초기화가 되어있어야 하기 때문.

class PointTest{
    public static void main(String args[]){
        Point3D p3 = new Point3D(1,2,3);
    }
}
class Point{
    int x, 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){
        super(x, y); // 조상클래스의 Point(int x, int y)와 같음. super()생성자를 안넣어주면 컴파일 에러 발생함.
        //this.x = x;
        //this.y = y;
        this.z = z;
        /*
            super()생성자를 넣지 않고 this.x = x, this.y = y, this.z = z만 사용하면 
            컴파일러가 자동으로 Point()생성자를 추가한다.
            하지만 조상클래스에 Point()생성자가 없기 때문에 컴파일 에러가 발생하게 되는 것.
            이를 해결하기 위해서는 super()생성자를 사용하거나 조상클래스에 Point()생성자를 추가해야한다.
        */
    }
    // 오버라이딩
    String getLocation(){ 
        return "x = " + x + ", y = " + y + ", z = " + z;
    }
}

🔸 조상클래스의 멤버변수는 조상클래스의 생성자에 의해 초기화되도록 해야한다.

profile
백견이 불여일타

0개의 댓글

관련 채용 정보