IT 개발노트

오버라이딩 본문

기초튼튼/JAVA

오버라이딩

limsungju 2019. 6. 7. 10:47

1. 오버라이딩(overriding)
1.1 오버라이딩이란?
- 조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 오버라이딩이라고 한다.

1.2 오버라이딩의 조건
- 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)
- 접근제어자를 좁은 범위로 변경할 수 없다.
-> 조상의 메서드가 protected라면, 범위가 같거나 넓은 protected나 public으로만 변경할 수 있다.
- 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

class Parent {
    void parentMethod() throws IOException, SQLException {
        // ...
    }
}

class Child extends Parent {
    void parentMethod() throws IOException { // 정상작동
        // ...
    }
}

class Child extends Parent {
    void parentMethod() throws Exception { // 에러발생!!!조상의 예외보다 더 많은 예외를 포함하기 때문.
        // ...
    }
}

1.3 오버로딩 vs 오버라이딩
오버로딩(over loading) : 기존에 없는 새로운 메서드를 정의하는 것(new)
오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)

class Parent {
    void parentMethod() {}
}

class Child extends parent {
    void parentMethod() {} // 오버라이딩
    void parentMethod(int i) {} // 오버로딩
    
    void childMethod() {}
    void childMethod(int i) {} // 오버로딩
    void childMethod() {} // 에러!!! 중복정의
}

1.4 super - 참조변수
- this : 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어있음 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재
- super : this와 같음. 조상의 멤버와 자신의 멤버를 구별하는데 사용

class Parent {
    int x=10; // Parent 클래스의 멤버변수
}

class Child extends Parent {
    int x=20; // Child 클래스의 멤버변수
    void method() {
        System.out.println("x=" + x); // 20
        System.out.println("this.x=" + this.x); // 20
        System.out.println("super.x=" + super.x); // 10
    }
}

class Parent {
    int x=10; // Parent 클래스의 멤버변수
}

class Child extends Parent {
    void method() {
        System.out.println("x=" + x); // 10
        System.out.println("this.x=" + this.x); // 10
        System.out.println("super.x=" + super.x); // 10
    }
}
class Point {
    int x;
    int y;
    
    String getLocation() {
        return "x :" + x + ", y :" + y;
    }
}

class Point3D extends Point {
    int z;
    String getLocation() { // 오버라이딩
    // return "x :" + x ", y :" + y + ", z :" + z;
    return super.getLocation() + ", z :" + z; // 조상의 메서드 호출
    }
}

1.5 super() - 조상의 생성자
- 자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
- 조상의 멤버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.

class Point {
    int x;
    int 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) { // 에러발생!!! Point()클래스의 기본생성자를 찾을 수 없다는 에러발생
        this.x = x;
        this.y = y;
        this.z = z;
    }
    
    String getLocation() { // 오버라이딩
        return "x :" + x + ", y :" + y + ", z :" + z);
    }
}

class PointTest {
    public static void main(String args[]) {
        Point3D p3 = new Point3D(1,2,3);
    }
}
class Point {
    int x;
    int 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);
        this.z = z;
    }
    
    String getLocation() { // 오버라이딩
        return "x :" + x + ", y :" + y + ", z :" + z);
    }
}

class PointTest {
    public static void main(String args[]) {
        Point3D p3 = new Point3D(1,2,3);
    }
}
class Point {
    int x;
    int y;
    
    Point() {}
    
    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) { // 정상작동
        this.x = x;
        this.y = y;
        this.z = z;
    }
    
    String getLocation() { // 오버라이딩
        return "x :" + x + ", y :" + y + ", z :" + z);
    }
}

class PointTest {
    public static void main(String args[]) {
        Point3D p3 = new Point3D(1,2,3);
    }
}

 

'기초튼튼 > JAVA' 카테고리의 다른 글

제어자  (0) 2019.07.01
package와 import  (0) 2019.06.09
상속  (0) 2019.06.07
변수의 초기화  (0) 2019.06.06
생성자  (0) 2019.06.05