///////
Search

13_다형성_이연재

1. 다형성

다형성: 객체들의 타입이 다르면 똑같은 메시지가 전달되더라도 서로 다른 동작을 하는것이다.
예제1) 다형성
class MobilePhone{ protected String number; public MobilePhone(String num){ number = num; } public void answer(){ System.out.println("Hi~ from " + number); } } class SmartPhone extends MobilePhone{ private String androidVer; public SmartPhone(String num, String ver){ super(num); androidVer = ver; } public void playApp(){ System.out.println("App is running in " + androidVer); } } public static void main(String[] args){ SmartPhone ph1 = new SmartPhone("010-555-777", "Nougat"); MobilePhone ph2 = new SmartPhone("010-999-333", "Nougat"); ph1.answer(); ph1.playApp(); System.out.println(); ph2.answer(); //ph2.playApp(); ->컴파일 에러(부모 형식으로 객체를 생성했는데 부모 클래스에 PlayApp()이 없기 때문에)
Plain Text
복사

2. 메소드 오버라이딩

자식의 함수를 호출한다.
예제2) 오버라이딩
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 static void main(String[] args){ Cake c1 = new CheeseCake(); CheeseCake c2 = new CheeseCake(); c1.yummy(); c2.yummy(); } //둘다 Yummy Cheese Cake가 출력된다.
Plain Text
복사
위 예제에서 CheeseCake(자식)의 yummy 메소드가 Cake(부모)의 yummy 메소드를 오버라이딩 한것이다.
super: 자식 메소드 말고 부모 메소드를 호출해 준다. 위 예제에서 super.yummy()를 추가하면 Yummy Cake와 Yummy Cheese Cake이 동시에 출력된다.

3. 업캐스팅과 다운 캐스팅

업캐스팅: 자식 객체를 부모 객체로 형변환
다운캐스팅: 부모 객체를 자식 객체로 형변환
예제3) 업캐스팅과 다운캐스팅
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() 호출 } }
Plain Text
복사

4. instanceof 연산자

캐스팅 가능여부를 물을때 많이 사용한다.
예제4) instanceof
public class ShapeTest4{ public static void print(Shape obj){ if(obj instanceof Rectangle) //obj: 객체(변수)명, Rectangle: 클래스 타입(이름) System.out.println("실제 타입은 Rectangle"); if(obj instanceof Triangle) System.out.println("실제 타입은 Triangle"); if(obj instanceof Circle) System.out.println("실제 타입은 Circle"); } }
Plain Text
복사