Java 19. 다형성

업데이트:
1 분 소요

다형성

1.다형성(polymorphism) 이란?

  • 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
  • 같은 코드에서 여러 다른 실행 결과가 나옴
  • 캡슐화(정보 은닉), 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나임.
  • 다형성을 잘 활용하면 유연하고 확장서있고, 유지보수가 편리한 프로그램을 만들 수 있음.
  • 하나의 참조변수 여러타입의 객체를 참조할 수 있는 것.
   - 하나의 코드로 여러 자료형으로 구현되어 실행되는 것
  • 상속한 클래스의 객체는 슈퍼 클래스로도 서브 클래스로도 다룰 수 있음.
   - 조상의 참조변수로 자손타입의 객체를 다룰 수 있는 것임.
  • 하위클래스 객체를 상위클래스에 대입하여 사용할 수 있음.

2.다형성을 사용하는 이유?

  • 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있음.
  • 그렇지 않은 경우 많은 if - else if문이 구현되고 코드의 유지보수가 어려움.
  • 상위클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능 구현.
  • 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할수 있음.

3.다형성으로 인한 형변환(캐스팅)

  • 형변환의 전제 조건 – 상속, 구현관계에 있는 것만 객체타입 변환이 가능.
  • Up - casting : 자손타입에서 조상타입 형변환, 형변환 생략가능. 묵시적
   - 조작 멤버변수가 줄어듦
  • Down - casting : 업캐스팅된 클래스를 다시 원래의 타입으로 형 변환.
   - 하위 클래스의 형 변환은 명시적으로 해야 함.

instanceof 연산자

  • 인스턴스 형 체크
  • 참조변수가 참조하는 인스턴스의 실제 타입을 체크하는데 사용함.
  • 원래 인스턴스의 형이 맞는지 여부를 체크해서 맞으면 true, 아니면 false 반환함.

4.매개변수의 다형성

  • 참조타입 매개변수는 메서드 호출시, 자신과 같은 타입이거나 또는 자손타입의 주소를 인스턴스를 넘겨줌

  • Car

public class Car {
		
	String color;
	int door;
	
	public void drive() {
		System.out.println("차가 달립니다.");
	}
	public void stop() {
		System.out.println("차가 멈춥니다.");
	}
}
  • Sport Car
public class SportCar extends Car {
	
	public void speedUp() {
		System.out.println("속도를 올립니다.");
	}
}
  • Police Car
public class PoliceCar extends Car {
	
	public void siren() {
		System.out.println("사이렌을 울립니다.");
	}
}
  • CarTest
public class CarTest {

	public static void main(String[] args) {
		
		Car car = null;
		SportCar sportCar=new SportCar();
		PoliceCar policeCar=new PoliceCar();
		
		sportCar.speedUp();	
		
		car = sportCar;				// 업캐스팅 (자손 -> 조상)
		
		SportCar sportCar2 = null;
		sportCar2 = (SportCar) car; // 다운캐스팅 (조상 -> 자손)
									// :조작할수 있는 멤버가 늘어남.
		sportCar2.speedUp();
		
		//sportCar = policeCar;
	}

}
  • InstanceTest
public class InstanceofTest {

	public static void main(String[] args) {
		
		SportCar sportCar = new SportCar();
		
		if(sportCar instanceof SportCar) {
			System.out.println("SportCar로 타입 변환이 가능하다.");
		}
		if(sportCar instanceof Car) {
			System.out.println("Car로 타입 변환이 가능하다.");
		}
		if(sportCar instanceof Object) {
			System.out.println("Object로 타입 변환이 가능하다.");
		}
	}

}

댓글남기기