Back-end/JAVA
JAVA 오버로드와 오버라이딩 차이점과 개념정리
1924
2022. 2. 2. 08:58
오버로딩과 오버라이딩 차이
오버로딩이란?
서로 다른 시그니처를 갖는 여러 메소드를 하나의 이름으로 정의하는 것이였다.
오버라이딩이란?
상속관계에 있는 부모클래스에서 이미 정의된 메소드를 자식클래스에서
같은 시그니처를 갖는 메소드로 재정의하는 것이라고 할 수 있다.
간단히 정의하면
오버로딩은 새로운 메소드를 정의
오버라이딩은 상속받은 기존 메소드를 재정의
class Parent {
void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}
class Child extends Parent {
// 오버라이딩된 display() 메소드
void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
void display(String str) { System.out.println(str); } // 오버로딩된 display() 메소드
}
public class Inheritance06 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
ch.display("오버로딩된 display() 메소드입니다.");
}
}
오버라이딩의 조건
1. 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전동일 해야한다.
하지만 메소드 반환타입은 부모클래스의 반환타입으로 변환할수 있는 타입이라면 변경가능하다.
2. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.
3. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.
메소드 오버라이딩
Car클래스를 상속받은 Bus클래스는 부모 클래스가 가지고 있는 run() 메소드를 잘 사용한다.
//run 메소드를 가지고 있는 Car클래스
public class Car{
public void run(){
System.out.println("Car의 run메소드");
}
}
//Car 를 상속받는 Bus 클래스
public class Bus extends Car{
}
public class BusExam{
public static void main(String args[]){
Bus bus = new Bus();
bus.run(); //Car의 run메소드가 실행된다.
}
}
Bus클래스에 부모가 가지고 있는 메소드와 모양이 같은 메소드를 선언
public class Bus extends Car{
public void run(){
System.out.println("Bus의 run메소드");
}
}
public class BusExam{
public static void main(String args[]){
Bus bus = new Bus();
bus.run(); //Bus run메소드가 실행된다.
}
}
BusExam을 실행하면 "Bus의 run메소드"가 출력된다.
메소드를 오버라이드하면, 항상 자식클래스에서 정의된 메소드가 출력된다.
오버라이드 한다고 해서 부모의 메소드가 소멸되는 것은 아니다.
super를 사용하면 부모 메소드를 호출할 수 있다.
public class Bus extends Car{
public void run(){
**super.run();** // 부모의 run()메소드를 호출
System.out.println("Bus의 run메소드");
}
}