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
복사