Polymorphism

ming·2023년 5월 27일
0

자바 기초

목록 보기
12/12

다형성 (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();
	}

}

0개의 댓글