본문 바로가기

Java SE Tutorials/Polymorphism

Java Polymorphism

Java 프로그래밍, 다형성 ( Polymorphism )


다형성의 개념 ( Polymorphism )

다형성의 사전적인 의미는 한 유기체나 생물의 종 안에서도 서로 다른 형태가 다양하게 존재하는 특성을 의미한다. 이러한 원리가 객체지향 언어에도 적용되어 객체지향 언어의 3대 특징( Inheritance, Polymorphism, Encapsulation )을 이루고 있다. 부모 클래스로부터 파생된 자식 클래스들은 모두 동일한 메소드를 가지고 있지만 자식 클래스에서 별도로 추가되거나 변경된 메소드가 있을 수 있기 때문에 같은 클래스의 2세대 자식 클래스라고 하더라도 약간의 다른 점이 존재하게 된다. 

아래의 코드에서 동일한 자료형을 가진 2개의 객체로부터 동일한 메소드를 호출함에도 불구하고 서로 다른 결과를 보여주고 있다. 이것으로 다형성의 한 단면을 확인할 수 있다


아래 코드의 실행 결과

차종:Sonata    제조사:현대 가격:3000 승차인원수:6
차종:Titan    제조사:기아 가격:3500 적재중량:5 

다형성(Polymorphism)을 테스트하는 코드

public class PolymorphismDemo {

	public static void main(String[] args) {
		
        Vehicle v1 = new Car("Sonata", "현대", 3000, 6);
        Vehicle v2 = new Truck("Titan", "기아", 3500, 5);
        
        // 동일한 Vehicle형 2개 객체의 동일 메소드 호출이지만 서로 다른 기능을 가진다
        v1.printInfo();  // Vehicle 클래스에 정의된 printInfo()가 호출되는 것이 아니다
        v2.printInfo();  // Vehicle 클래스에는 없는 메소드가 호출되므로 Virtual Method Invocation이라고 한다
	}
}

class Vehicle
{
	String name;
	String company;
	int price;
	
	public Vehicle(String name, String company, int price) {
		this.name = name;
		this.company = company;
		this.price = price;
	}
	
	public void printInfo() {
		System.out.printf("%n차종:%s \t제조사:%s \t가격:%d \t", name,company,price);
	}
}

class Car extends Vehicle {
	int passengers; // 승차인원 수
	
	Car(String name, String company, int price, int passengers) {
		super(name, company, price);
		this.passengers = passengers;
	}

	@Override  // Vehicle 클래스 printInfo() 메소드 오버라이딩
	public void printInfo() {
		super.printInfo();
		System.out.printf("승차인원수:%d \t", passengers);
	}
}

class Truck extends Vehicle {
	int maxLoad;
	
	Truck(String name, String company, int price, int maxLoad) {
		super(name, company, price);
		this.maxLoad = maxLoad;
	}

	@Override  // Vehicle 클래스 printInfo() 메소드 오버라이딩
	public void printInfo() {
		super.printInfo();
		System.out.printf("적재중량:%d %n", maxLoad);
	}
}