하나의 메소드나 클래스가 있을때 다양한 방법으로 동작
class O{
public void a(int param){
System.out.println("숫자출력");
}
public void a(String param){
System.out.println("문자열출력");
}
}
public class PolymorphismOverloadingDemo{
public static void main(String[] args){
O o = new o();
o.a(1);
o.a("one");
}
}
메소드 a는 하나지만 결과는
숫자출력
문자열출력
다양하게 나오게 된다(오버로딩을 통한 다형성)
메소드와 클래스를 바라보는 시야늘 넓히기 위해서
class A{}
class B extends A{}
public classs PolymorphismDemo1{
public static void main(String[] args){
A obj = new B();
}
}
클래스 A를 상속 받은 B
클래스 B를 obj로 인스턴스화
데이터 타입은 A인 obj
이게 무슨 말이지...
class A{
public String x(){return "x";}
}
class B extends A{
public String y(){return "y";}
}
public class polymorphismDemo1{
public static void main(Strin[] args){
A obj = new B();
obj.x();
obj.y(); // 이 부분에서 error
}
}
obj는 실질적으로는 class B를 인스턴스화하고 있지만 class A행세를 하고 있음
==> 부모 클래스인 A에는 메소드 y가 없으므로 error가 발생함
위의 소스 코드를 더 추가해봄
class A{
public String x(){return "A.x";}
}
class B extends A{
public String x(){return "B.x";} // 클래스 A의 메소드 x를 오버라이딩(우선순위가 높음)
public String y(){return "y";}
}
public class polymorphismDemo1{
public static void main(Strin[] args){
A obj = new B();
System.out.println(obj.x()); // B.x
}
}
위 코드의 출력 값은 B.x
가 나오게 됨(class B의 x()를 선택함) : 오버라이딩 하면서 인스턴스화 시킨 메소드를 사용하게 됨
위 코드에서 코드를 더 추가함
class A{
public String x(){return "A.x";}
}
class B extends A{
public String x(){return "B.x";}
public String y(){return "y";}
}
class B2 extends A{
public String x(){return "B2.x";}
}
public class polymorphismDemo1{
public static void main(Strin[] args){
A obj = new B();
A obj2 = new B2();
System.out.println(obj.x()); //B.x
System.out.println(obj2.x()); //B2.x
}
}
위 코드의 출력 값은
B.x
B2.X