메서드 오버라이딩
오버라이딩이란?
•
조상 클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것
class Shape{
public void draw() {
System.out.println("도형을 그립니다.");
}
}
class Triangle extends Shape {
@Override
public void draw() {
System.out.println("삼각형을 그립니다."); }
}
Java
복사
class Shape{
public void draw() {
System.out.println("Shape");
}
}
class Circle extends Shape {
@Override
public void draw() {
System.out.println("Circle을 그립니다.");
}
}
class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("Rectangle을 그립니다.");
}
}
class Triangle extends Shape {
@Override
public void draw() {
System.out.println("Triangle을 그립니다.");
}
}
Java
복사
메서드 오버라이딩의 조건
•
선언부가 같아야 함(메서드 이름, 매개변수, 리턴타입)
•
조상 클래스의 메서드보다 범위가 넓거나 같아야 함
•
조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없음
메서드 오버라이딩 예제
class Cake {
public void yummy() {
System.out.println("Yummy Cake");
}
}
class CheeseCake extends Cake {
// ChessCake의 yummy 메서드가 Cake의 yummy 메서드를 오버라이딩
public void yummy() {
System.out.println("Yummy Cheese Cake");
}
}
public class CakeTest {
public static void main(String[] args) {
Cake c1 = new CheeseCake();
CheeseCake c2 = new CheeseCake();
c1.yummy();
c2.yummy();
}
}
Java
복사
오버라이딩 된 메서드 호출 예제
class Cake {
public void yummy() {
System.out.println("Yummy Cake");
}
}
class CheeseCake extends Cake {
public void yummy() {
super.yummy();
System.out.println("Yummy Cheese Cake");
}
public void tasty() {
super.yummy();
System.out.println("Yummy Tasty Cake");
}
}
Java
복사
•
오버라이딩 된 메서드를 인스턴스 외부에서 호출하는 방법은 없음
•
인스턴스 내부에서는 키워드 super를 통해 호출 가능
참조변수
오버로딩과 오버라이딩의 차이
•
오버로딩 : 기존에 없는 새로운 메서드를 정의
•
오버라이딩 : 상속받은 메서드의 내용을 변경
업캐스팅&다운캐스팅
업캐스팅
•
자식클래스의 객체가 부모클래스의 타입으로 형변환 되는 것
다운캐스팅
•
업캐스팅 된 객체를 다시 부모클래스 타입의 객체로 형변환하는 것
예제
class Parent {
void print() {
System.out.println("Parent 메서드 호출");
}
}
class Child extends Parent {
@Override
void print() {
System.out.println("Child 메서드 호출");
}
}
public class Casting {
public static void main(String[] args) {
Parent p = new Child(); // 업캐스팅
p.print(); // 동적 메서드 호출, 자식의 print() 호출
// Child c = new Parent(); // 컴파일 오류
Child c = (Child)p; // 다운캐스팅
c.print(); // 메서드 오버라이딩, 자식 객체의 print() 호출
}
}
Java
복사
다형성의 활용
다형성 사용시 유지 보수가 쉽고 재사용성이 증가
Instanceof연산자
•
참조변수가 참조하는 인스턴스의 실제 타입을 체크하는데 사용
•
캐스팅 가능 여부를 확인하기 위해 사용
•
instanceof의 연산 결과가 true일 때 해당 타입으로 형변환 가능
instanceof 예제
public class ShapeTest4{
public static void print(Shape obj){
if(obj instanceof Rectangle)
System.out.println("실제 타입은 Rectangle");
if(obj instanceof Triangle)
System.out.println("실제 타입은 Triangle");
if(obj instanceof Circle)
System.out.println("실제 타입은 Circle");
}
}
Java
복사