/ JAVAJUNGSUK

Ch7-7~9. 오버라이딩

자바의 정석 기초편

0. 목차



Chapter7. 객체지향 프로그래밍Ⅱ

Ch7 - 7. 오버라이딩

Ch7 - 8. 오버라이딩의 조건

Ch7 - 9. 오버로딩 vs. 오버라이딩



Ch7 - 7. 오버라이딩


▶ 오버라이딩(overriding)이란?

▷ overriding : v. 덮어쓰다
▷ 상속받은 조상의 메서드를 자신에 맞게 변경하는 것
class Point {
    int x;
    int y;

    String getLocation() {
        return "x : " + x + ", y : " + y;
    }
}

class Point3D extends Point {
    int z;

    String getLocation() { // 조상의 String getLocation()을 오버라이딩
        return "x : " + x + ", y : " + y + " z : " + z; // 선언부 변경불가, 구현부 변경가능
    }
}

▶ Object 클래스의 toString()을 오버라이딩

▷ p.toString()
class Point {
    int x;
    int y;

    public String toString() {
        return "x : " + x + ", y : " + y;
    }
}

class OverrideTest {
	
	public static void main(String[] args) {
		
		Point p = new Point();
		
		System.out.println(p.toString());
	}
}

// console
x : 0, y : 0
▷ p만 넣어도 toString() 출력
class OverrideTest {
	
	public static void main(String[] args) {
		
		Point p = new Point();
		
		System.out.println(p);
	}
}

// console
x : 0, y : 0
▷ 매개변수가 있는 생성자를 이용하여 x, y 출력
class Point {
    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 {
	
	public static void main(String[] args) {
		
		Point p = new Point(5, 9);
		
		System.out.println(p);
	}
}

// console
x : 5, y : 9



Ch7 - 8. 오버라이딩의 조건


▶ 오버라이딩의 조건 3가지

▷ 선언부가 조상 클래스의 메서드와 일치해야 함
  • 선언부반환 타입, 메서드 이름, 매개변수 목록 모두 일치해야 함

▷ 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없음
  • 접근 제어자 : public, protected, private, defalt
▷ 예외는 조상 클래스의 메서드보다 많이 선언할 수 없음




Ch7 - 9. 오버로딩 vs. 오버라이딩


오버로딩과 오버라이딩은 이름만 비슷할 뿐 전혀 관계 없음


▶ 오버로딩(overloading)

▷ 기존에 없는 이름이 같은 새로운 메서드를 정의하는 것(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() { } // 에러, 중복 정의
}