메소드 오버로딩이랑 메소드 오버라이딩을 구분할 필요가 있다.
메소드 오버로딩 vs 메소드 오버라이딩
- 메소드 오버로딩이란 서로 다른 시그니처(매개변수 목록)를 갖는 여러 메소드를 하나의 이름으로 정의하는 것이다.
- 메소드 오버라이딩이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니처를 갖는 메소드로 다시 재정의 하는 것을 의미한다.
자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외하고 모든 메소드를 상속받는다.
이를 그대로 사용해도 되지만, 재정의해서 사용할 수도 있다.
상속받은 부모 클래스의 메소드를 재정의하기 위해 사용하는 것을 메소드 오버라이딩이라고 한다.
메소드 오버라이딩의 조건
자식 클래스 메소드의 선언부 = 부모 클래스 메소드의 선언부
메소드의 반환 타입은 부모 클래스의 반환 타입으로 변환 가능하면 변경이 가능하다.
부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경이 불가능하다.
부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.
예시
class Parent {
void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}
class Child extends Parent {
void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
}
public class Inheritance05 {
public static void main(String[] args) {
Parent pa = new Parent();
pa.display();
Child ch = new Child();
ch.display();
Parent pc = new Child();
pc.display(); // Child cp = new Parent();
}
}
Parent pc = new Child(); // 오버라이딩 구현 : 다형성(polymorphism), 하나의 객체가 여러 가지 타입을 가질수 있는 것을 의미한다.(부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 구현)
Child cp = new Parent();// 불가능(새롭게 정의된 객체가 부모 객체의 타입을 참조하였기 때문이다.)
오버라이딩 : 상속받은 기존의 메소드 재정의
오버로딩 : 새로운 메소드 정의
오버로딩과 오버라이딩을 동시에 수행하는 예제
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() 메소드입니다.");
}
}
<참고 자료 및 코드 참조>
http://www.tcpschool.com/java/java_inheritance_overriding
'Java > Java Concept' 카테고리의 다른 글
[Java] HashMap, HashSet 개념정리 (2) | 2022.10.31 |
---|---|
ArrayList<E> 클래스 및 제네릭 함수 개념 (0) | 2022.08.13 |
상속(inheritance) (0) | 2022.08.09 |
메소드의 구분(클래스 메소드, 인스턴스 메소드) (0) | 2022.08.09 |
필드의 구분(클래스 변수, 인스턴스 변수, 지역 변수) (0) | 2022.08.09 |