메서드 오버라이딩(method overriding)
개념
- 상속 관계에 있어서
- 부모 클래스에 정의되어 있는 메서드를 자식 클래스에서 상속 받아서, 메서드의 선언부는 같고, 구현부의 내용만 다르게 재정의하여 사용하는 것
- 즉, 상속 받은 부모 클래스의 메서드를 재정의하여 사용하는 것
특징
- 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메서드를 상속 받아서 사용할 수 있음
- 상속받은 메서드는 그대로 사용해도 되고,
- 필요한 동작을 위해서 재정의하여 사용할 수도 있음
- 기존의 메서드를 재정의해서 사용하는 것이 메서드 오버라이딩
오버라이딩의 조건
- 오버라이딩은 메서드의 동작만을 재정의 하므로, 메서드의 선언부는 부모 클래스의 메서드와 완전히 같아야 하고
- 기존 메서드의 구현부만 재정의하여 사용
- 부모 클래스의 메서드보다 접근 제어자를 더 좁은 범위로 변경할 수 없음
- 부모 클래스의 메서드보다 더 큰 범위의 예외를 선언할 수 없음
예제
class Parent {
void talking() {
System.out.println("부모 클래스의 talking() 메소드");
}
}
class Child extends Parent {
@Override
void talking() {
System.out.println("자식 클래스의 talking() 메소드");
}
}
public class Inheritance {
public static void main(String[] args) {
Parent parent = new Parent();
parent.talking();
Child child = new Child();
child.talking();
Parent parentchild = new Child();
parentchild.talking(); // 자식 클래스에서 오버라이딩한 메서드가 출력
}
}
[ 실행 결과 ]
자바의 다형성
- 부모 타입의 참조변수로 자식의 인스턴스를 참조할 수 있음
Parent pa = new Child();
pa.taking; // 오버라이딩한 메서드가 나옴
[ 다형성 ]
1. 개념
- 하나의 객체가 여러 타입의 객체를 가질 수 있음
- 즉, 클래스의 상속 관계에서 부모 클래스 타입의 참조 변수로 자식 클래스의 인스턴스(객체)를 참조할 수 있음
2. 참조변수의 다형성
- 클래스들 사이에서 반드시 상속 관계가 전제할 것
- 다형성을 위하여 부모 클래스 타입의 참조변수로 자식 클래스 타입의 인스턴스(객체)를 참조할 수 있도록 함
- 반대의 경우, 자식 클래스 타입의 참조 변수로는 부모 클래스 타입의 인스턴스를 참조할 수 없음
- 그 이유는, 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버(부모 클래스 인스턴스)보다 많기 때문이고
- 자식 클래스는 부모의 멤버를 상속 받기 때문에, 사용할 수 있는 멤버의 개수가 부모 클래스보다 같거나 더 많음
class Parent { } class Child extends Parent { } public class Main { public static void main(String [] args) { Parent pa = new Parent(); // 허용 Child ch = new Child(); // 허용 // 다형성 이용 Parent pa2 = new Child(); // 허용 // 자식 타입의 참조변수로, 부모 클래스 타입의 인스턴스 참조 X Child ch2 = new Parant(); // 오류 발생, (X) } }
오버로딩과 오버라이딩
1. 오버로딩
- 메서드의 이름은 같고, 매개변수의 타입, 매개변수의 개수을 다르게 설정하여
- 아예 새로운 메서드를 정의하는 것
- [ 주의할 점 ] 리턴 타입만 다른 메서드는 같은 메서드로 취급함
2. 오버라이딩
- 상속 관계일 것
- 상속 받은 기존의 메서드를 재정의하여 사용
- @Override
예제
- 오버로딩과 오버라이딩 메서드
class Parent {
void talking() {
System.out.println("부모 클래스의 talking() 메소드");
}
}
class Child extends Parent {
// 오버라이딩 한 talking() 메서드
@Override
void talking() {
System.out.println("자식 클래스의 talking() 메서드");
}
// 오버로딩한 talking() 메서드
void talking(String str) { // 메서드 이름은 같지만, 매개변수의 개수가 다름
System.out.println(str);
}
}
public class Inheritance {
public static void main(String[] args) {
Child child = new Child();
child.talking();
child.talking("오버로딩된 talking() 메서드!");
}
}
[ 실행 결과 ]
출처
'JAVA' 카테고리의 다른 글
[JAVA] final 지정자(클래스, 메서드, 변수에 지정하기) (0) | 2024.04.22 |
---|---|
[JAVA] 싱글톤 패턴(만드는 방법, 사용하는 이유, 장단점) (0) | 2024.04.22 |
[JAVA] super와 super(), this와 this() (0) | 2024.04.21 |
[JAVA] 다형성, 참조변수의 형변환(업캐스팅, 다운캐스팅) (1) | 2024.04.19 |
[JAVA] JAVA 메모리 영역(method, stack, heap 영역) (0) | 2024.04.19 |