다형성 (polymorphism)
- 상속관계의 계층구조에서 상위타입의 변수로 모든 하위타입을 참조
- 서로 다른 데이터를 배열에 저장하거나 서로 다른 데이터를 하나의 메서드에 전달하는 경우 다형성을 활용할 수 있다.
- 재사용성 향상, 효율적으로 관리 가능
- Object 타입의 변수는 다형성이 적용되어 모든 타입의 변수 저장 가능
사용
package pack3;
//230106(3)
public class Dog {
//개의 특성
private String name ="개";
//private 는 상속 안 됨. name은 다른 자식 클래스에 존재하지 않는 하나임.
//자식이 super(name)을 통해 name을 설정.
public Dog() {
// TODO Auto-generated constructor stub
}
public Dog(String name) {
this.name=name;
}
public String getName() {
return name;
}
public String callName() {
return "종류는 " +name;
}
public void print() {
System.out.println(name+"는 지구에 산다");
}
}
package pack3;
//230106(3)
public class DogHouse extends Dog{
private String where ="집";
public DogHouse(String name) {
super(name);
}
public void show() {
System.out.println(where+"에 살아");
}
@Override
public void print() {
System.out.println(getName()+" : "+where+"에 삼");
//자동으로 부모의 메소드를 찾는다.
}
}
package pack3;
//230106(3)
public class DogWolf extends Dog{
private String where ="산";
public DogWolf(String name) {
super(name);
}
public DogWolf(String name,String where) {
super(name);//name은 받아서 부모에게 줌
this.where=where;
}
public void show() {
System.out.println("사는 곳: "+where+"속");
}
@Override
public void print() {
System.out.println(getName()+" : "+where+"에 산다고 알려짐");
}
public void display() {
print();
this.print();
super.print();
}
}
package pack3;
//230106(3)
public class DogMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog dog =new Dog();
dog.print();
System.out.println(dog.callName());
System.out.println();
DogHouse doghouse = new DogHouse("집 개");
doghouse.print();
System.out.println(doghouse.callName());
doghouse.show();
System.out.println("==================");
DogWolf dogW = new DogWolf("늑대");
dogW.show();
System.out.println(dogW.callName());
dogW.display();
System.out.println("~~~~~~~~~");
DogWolf bushdog=dogW;
//bushdog.display();
bushdog.print();
//dogW=null;
System.out.println();
Dog dog2=dogW;//자식 객체의 주소를 부모 객체에게 주는 것은 가능
//자식이 부모를 가지지만 타입은 부모.
//자식의 메소드 부르는 것을 허용
dog2.print();
//dog2.show();
//부모 클래스 변수는 자식의 메소드를 호출 가능 단, 오버라이딩 된 메소드만 가능(불간섭의 법칙)
//만약 부모와 자식에 모두 동일한 변수가 있다면, 컴파일 단계와 실행단계를 구분하지 않고 모두 부모타입의 변수로 인식.
//dogW=dog;//부모객체변수 자식에게 줄 수 없음
//dogW=dog2;//안돼~ 그러나 음...(부모타입이나 자식의 주소를 가지기 때문에 자식으로 강제형변환 가능)
dogW=(DogWolf)dog2;//casting
System.out.println();
DogWolf fox=new DogWolf("여우","숲");
fox.print();
fox.display();
}
}