다형성(Polymorphism)

까만호랭·2023년 8월 14일
1
post-thumbnail

다형성 개념

부모-자식 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시킨다.

다형성을 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알수 없어도 오버라이딩을 통해 자식 클래스를 접근할 수 있다.

  • 다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미
  • 다향성 실습

    public class Test24PolyCar { //자동차에 대한 원형(슈퍼) 클래스
    	protected int speed=50;
    	
    	public Test24PolyCar() {
    		System.out.println("나는 자동차야~~~");
    	}
    	
    	public void dispData() {
    		System.out.println("속도 : "+speed);
    	}
    	
    	public int getSpeed() {
    		return speed;
    	}
    }

    먼저 polycar라는 클래스를 만들었다.

    public class Test24PolyBus extends Test24PolyCar{
    	private int passenger=10;
    	// 생성자 생략 - 생성자 속에 super();가 있음
    	public Test24PolyBus() {
    		super();
    	}
    	public void show() {
    		System.out.println("버스");
    	}
    	
    	@Override //annotation 메타데이터
    	public void dispData() {
    		System.out.println("버스의 승객은 "+passenger);
    		System.out.println("버스의 속도는 "+speed);
    	}
    
    }

    Test24PolyBus 클래스는 Test24PolyCar 클래스를 상속받았다.
    이때 super()가 들어간 생성자는 생략이 가능하지만 그냥 써줬다.
    메소드 오버라이딩을 통해 disData()를 써줬다.

    public class Test24PolyMain {
    
    	public static void main(String[] args) {
    		Test24PolyCar car1=new Test24PolyCar();   
    		Test24PolyBus bus1=new Test24PolyBus();    
    		System.out.println();
    		
    		car1.dispData();
    		System.out.println(car1.getSpeed());
    		
    		System.out.println();
    		bus1.dispData();
    		bus1.show();
    		System.out.println(bus1.getSpeed());
    		
    		System.out.println("-------------");
    		Test24PolyCar car2=new Test24PolyBus();  //업캐스팅
    		car2.dispData(); //polycar 타입의 car2인데 bus내용이 출력
    		//car2.show(); //show는 오버라이딩이 안된 메소드여서(자식 고유 메소드라 호출불가). disData는 오버라이딩 된 메소드라 호출가능!!!
    		System.out.println(car2.getSpeed());
    		
    		System.out.println();
    		//Test24PolyBus bus2=new Test24PolyCar(); //자식객체가 부모객체에게 줄 순 없다!!
    		//Test24PolyBus bus2=car1; //얘도 안됨 
    		Test24PolyBus bus2=(Test24PolyBus)car2; //casting
    		// 위는 부모타입이지만 자식 객체의 주소를 가지므로 캐스팅이 가능하다.
    		bus2.dispData();
    		System.out.println(bus2.getSpeed());
    		bus2.show(); //결국 PolyBus는 다시 PolyBus가 됨
    		
    		System.out.println();
    		Test24PolyCar polyCar=null;
    		Test24PolyBus polyBus=new Test24PolyBus();
    		polyCar=polyBus; //promotion
    		polyCar.dispData(); // 1 : 버스의 속도는 50 
    		// 똑같은 걸 써도 결과가 달라질 수 있다. : 다향성
    	}
    }

    Test24PolyCar car1=new Test24PolyCar();
    Test24PolyBus bus1=new Test24PolyBus();
    코드들을 통해 car, bus 클래스에 각각 객체를 생성 및 호출하여
    나는 자동차야~~~ 라는 문구가 두번 호출됨


    car1과 bus1를 실행하면 Centered Image
    다형성 코드 : Test24PolyCar car2=new Test24PolyBus();
    ==>> car2는 상위 클래스인 Test24PolyCar의 참조 변수이며, 해당 변수에는 Test24PolyBus 클래스의 객체 주소가 할당된 상태
    즉, 원래는 car2가 Test24PolyCar의 참조변수 였는데 new Test24PolyBus()를 통해 car2는 Test24PolyBus의 객체가 된 셈
    위와 같은 다향성 코드를 통해 버스는 속도 50이라는 car의 특성을 받음 Centered Image

    업캐스팅

    위 코드들을 보면 Test24PolyBus 클래스는 Test24PolyCar 클래스를 상속받았다.
    따라서 Test24PolyBus는 Test24PolyCar의 하위 클래스이다.

  • 업캐스팅은 하위 클래스의 객체를 상위 클래스 타입의 참조 변수로 다루는 것을 의미한다.

  • Test24PolyCar car2 = new Test24PolyBus();는 Test24PolyBus 객체를 Test24PolyCar 타입의 참조 변수 car2로 다루는 것이다.
  • 다향성

  • 업캐스팅을 통해 상위 클래스 타입의 참조 변수로 하위 클래스의 객체를 다루는 것은 다형성의 한 예이다.
  • 다형성은 상위 클래스와 하위 클래스 사이의 관계를 이용하여, 여러 타입의 객체를 하나의 인터페이스나 상위 클래스 타입으로 다룰 수 있는 능력을 말한다.
  • car2는 컴파일 시에는 Test24PolyCar 타입으로 인식되지만, 실행 시에는 실제 객체의 타입에 따라 메소드 호출이 결정됩니다. 이를 "동적 바인딩" 또는 "런타임 다형성"이라고 한다.
  • 따라서, Test24PolyCar car2 = new Test24PolyBus(); 코드를 사용하면, car2는 Test24PolyBus의 인스턴스를 가리키며, 해당 인스턴스의 메소드가 호출될 때는 실제 객체의 타입에 따라 메소드가 동적으로 결정된다.
  • 이러한 다형성의 개념은 객체 지향 프로그래밍에서 유연한 코드 작성과 재사용성을 높이는 데 큰 역할을 한다.
  • profile
    남들과 함께 발자국을 남기는 까만호랭

    0개의 댓글