[Java] 객체지향 프로그래밍(oop) - 오버라이딩(overriding)

SolChan Kim·2023년 12월 7일

📖오버라이딩이란?

  • 조상으로부터 상속받은 메서드의 내용을 자손에 맞게 변경하는 것

  • 조상으로부터 상속받은 메서드는 그대로 사용하기도 하지만
    경우에 따라서는 자손클래스에 맞게 내용을 변경해야 할 때가 있다.

public class Animal{
	
    public void crying{
    	System.out.pringln("Animal cries")
    }
}

public class Dog extends Animal{
	// 오버라이딩
	@ Override
	public void crying{
    	System.out.pringln("Dog cries")
    }
}

모든 동물을 표현하기 위한 Animal클래스가 정의되어 있다.

Animal클래스에는 동물의 울음을 나타내는 메서드가 있다.

그 다음에는 Animal클래스를 조상으로 하는 Dog클래스가 정의되어 있다.

이 클래스는 강아지만을 표현하기 위한 것이므로 Animal클래스로부터
상속받은 crying메서드를 Dog클래스에 맞게 재정의 하였습니다.

이것이 오버라이딩이다.


📖오버라이딩의 조건

1. 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)

  • 오버라이딩은 메서드의 내용만을 변경하는 것이기 때문에
    선언부는 상속받은 메서드와 정확히 일치해야한다.

  • 만일 매개변수가 달라지면 오버로딩이 된다.

    • 재정의가 아니라 새로운 메서드가 하나 추가되는 것이다.

2. 접근제어자를 좁은 범위로 변경해서는 안된다.

  • 오버라이딩을 할 때는 선언부를 똑같이 해야하지만
    접근제어자는 변경할 수 있다.
    • 조상이 가진 메서드의 제어자가 protected라면
      범위가 같거나 넓은 protected, public으로만 변경할 수 있다.

3. 조상클래스의 메서드오바 많은 수의 예외를 선언할 수 없다.

  • 메서드를 수행하는 동안 여러가지 예외상황이 발생할 수 있다는 것을
    알려주기 위해 예외를 선언할 수 있다.(예외처리, 추후에 정리)

  • 예외의 개수가 오버라이딩하려는 메서드,
    즉 덮어쓰려는 메서드보다 더 많아서는 안된다.


📖오버로딩 vs 오버라이딩

오버로딩(over loading)

  • 기존에 없는 새로운 메서드를 정의하는 것(new)

오버라이딩(overriding)

  • 상속받은 메서드의 내용을 변경하는 것(change, modify)
public class Parent{
	void parentMethod(){}
}

public class Child extends Parent{
	@ Override
	public void parentMethod(){} // 오버라이딩
    public void parentMethod(int i){} // 오버로딩
    
    public void childMethod(){}
    public void childMethod(int i){} // 오버로딩
    public void childMethod(){} // Error : 중복정의
}

첫번째 메서드는 조상의 parentMethod와 선언부가 같으니까 오버라이딩이다.

두번째 메서드는 메서드의 이름은 같고 매개변수가 다르니까 오버로딩이다.

네번째 childMethod는 바로 위의 메서드와 이름이 같고
매개변수가 다르니까 오버로딩이다.

다섯번째 메서드는 같은 클래스 내에서 똑같은 선언부를 가진 메서드가
이미 정의되었으므로 에러가 발생한다.

0개의 댓글