///////
Search

13_다형성_조문주

메서드 오버라이딩

오버라이딩이란?
조상 클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것
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
복사