📚 참고
자바의 정석 기초편 (객체지향개념만)

 

 

 

 

 

 

 

 

 

 

오버라이딩

 

  • Override : 덮어쓰다
  • 상속 받은 조상의 메서드를 자신에게 맞게 변경하는 것

 

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;
    }
}

 

  • 선언부 변경불가
  • 내용만 변경가능
  • 조상의 getLocation 메서드도 상속이 되긴하나, 오버라이딩 된 메서드가 호출된다.

 

 

 

 

 

 

 

예제

 

class Point extends Object {
    int x;
    int y;
    
    Point(int x, int y) {
    	this.x = x;
        this.y = y;
    }
    
    public String toString() {
    	return "x: " + x + ", y: " + y;
    }
}

class OverrideTest {
    // Point p = new Point();
    // p.x = 3;
    // p.y = 5;
    // System.out.println(p.toString);		// x: 3, y: 5
    
    Point p = new Point(3, 5);
    // p.toString() 호출됨
    System.out.println(p);					// x: 3, y: 5
}

 

 

 

 

 

 

 

오버라이딩 조건

 

  1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
    • 선언부 : 반환타입, 메서드명, 매개변수 목록
  2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
    • 접근 제어자 : public, protected, (default), private
  3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

 

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

class Child extends Parent {
    // 가능
    void parentMethod() throws IOException { ... }
    
    // 불가능
    void parentMethod() throws IOException, SQLException, RuntimeException { ... }
}

 

 

 

 

 

 

 

오버로딩 VS 오버라이딩

 

  • 오버로딩 : 기존에 없는, 이름만 같은 새로운 메서드를 정의 (new)
  • 오버라이딩 : 상속 받은 메서드의 내용을 변경 (change, modify)

 

class Parent {
    void parentMethod() {}
}

class Child extends Parent {
    void parentMethod() {}		// 오버라이딩
    void parentMethod(int i) {}	// 오버로딩
    
    void childMethod() {}		// 메서드 정의
    void childMethod(int i) {}	// 오버로딩
    void childMethod() {}		// 🚩에러 중복정의
}