본문 바로가기
공부/자바

오버라이딩(overriding)

by xladmt 2024. 5. 31.

오버라이딩이란?

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만 자손 클래스 자신에 맞게 변경해야하는 경우가 많다. 이럴때 조상의 메서드를 오버라이딩한다.

*override의 사전적 의미는 '~위에 덮어쓰다(overwrite)'이다.

 

class Point{
    int x;
    int y;
    Stirng getLocation() {
    	return "x: "+x+", y: "+y; 
}

class Point3D extends Point {
    int z;
    String getLocation() { //오버라이딩
    	return "x: "+x+", y: "+y+", z:"+z; 
    }
}

 

  • 조상클래스로부터 상속 받은 메서드를 변경한다.
  • 자식 클래스에 오버라이딩한 메서드가 있으면 먼저 호출되고 -> 없으면 부모 클래스 -> 없으면 Object에서 찾는다.
  • static메서드는 컴파일 돌릴 때 실행. 인스턴스는 실행 중에 올라간다.

 

오버라이딩의 조건

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

=> 즉, 선언부가 서로 일치해야 함. 다만, 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경 가능함.

 

  • 조상 클래스의 메서드를 자손 클래스에서 오버라이딩 할 때
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
( 조상의 메서드가 protected면, 자식은 protected나 public만)
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
- 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
Q. 조상 클래스에 정의된 static 메서드를 자손 클래스에서 똑같은 이름의 static메서드로 정의할 수 있나요?
A. 가능합니다. 하지만, 이것은 각 클래스에 별개의 static메서드를 정의한 것일 뿐 오버라이딩이 아니다. 각 메서드는 클래스 이름으로 구별될 수 있으며, 호출할 때는 '참조변수.메서드이름()' 대신 '클래스이름.메서드이름()'으로 하는 것이 바람직하다. static 멤버들은 자신들이 정의된 클래스에 묶여있다고 생각하면 된다.

 

오버로딩 vs 오버라이딩

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

*헷갈리지 않게 잘 기억하자!!

 

[참고]

Java의 정석(남궁성 저)

'공부 > 자바' 카테고리의 다른 글

제어자(modifier)  (0) 2024.05.31
Package & import  (0) 2024.05.31
상속 & 클래스 간의 관계  (0) 2024.05.30
변수의 초기화  (0) 2024.05.29
생성자(Constructor)  (0) 2024.05.29