자바 다형성 메서드호출

Hyun Kyung Nam·2024년 4월 23일
0

개념정리

목록 보기
11/14
post-thumbnail

상속, interface를 배우고 다형성을 배우면서 의문이 드는 점이 있었다.

❓상위클래스 배열에 넣은 하위클래스의 메소드 호출을 어떻게 할까?

Vehicle이라는 추상클래스를 상속받아서 구현한 CarAirplane이라는 클래스가 있다. 그 중 Airplane이라는 클래스는 Flyable이라는 인터페이스도 함께 구현하였다.

이 둘을 Vehicle 배열에 넣어놓으면 Car에서 구현하거나 Airplane에서 구현한 함수는 호출이 불가하였다.

이부분을 어떻게 구현할까 고민하다 형변환이 가능 한 것을 발견하였다.

형변환은 기본자료형에서만 가능 할 줄 알았지만 참조 변수도 형변환이 가능하다고 하다.

형 변환을 위한 조건

서로 상속관계에 있는 상위 클래스 : 하위 클래스 사이에만 형 변환이 가능하다.
업 캐스팅(하위 클래스 타입에서 상위 클래스 타입으로 형 변환)은 형 변환 연산자를 생략할 수 있다.
다운 캐스팅(상위 클래스에서 하위 클래스 타입으로 변환)은 형 변환 연산자를 반드시 작성해야 한다.
출처: https://ittrue.tistory.com/132 [IT is True:티스토리]

업캐스팅
업캐스팅의 경우 형변환 연산자 생략가능 (Vehicle) 생략가능!
Vehicle airplane = (Vehicle) new Airplane();에서
다운캐스팅
다운캐스팅의 경우 형 변환 연산자를 반드시 작성해야한다.
((Airplane) airplane).fly();

형변환을 이용하여 상위클래스 배열에 넣어놨더라도 하위 클래스에 있는 메소드를 호출 가능하다.

vehicle에 추상메소드로 move가 있어서 vehicle배열에 car와 airplane인스턴스를 추가하여 반복문돌릴때 move호출이 가능하다.

//추상클래스 Vehicle
public abstract class Vehicle {
	abstract public void move();
}
//Main 클래스
public class VehicleMain {

	public static void main(String[] args) {
		ArrayList<Vehicle> vehicles = new ArrayList<>();
		
		vehicles.add(new Car());
		vehicles.add(new Airplane());

		for(Vehicle vehicle:vehicles) {
			vehicle.move();
		}
	}
}

Airplane에서 Flyable을 상속받아 구현한 fly 메소드를 호출하고 싶은데
어떻게 할까 고민을하였다.

형변환이 가능한지 여부를 따져서 가능하면 호출하는 방법을 생각해보았다.

instanceof를 사용하면 형변환 가능여부 를 boolean으로 반환한다고한다.
그래서 vehicle을 Airplane클래스로 형변환이 가능하면 fly메소드를 호출하겠다. 이렇게 코드를 짜보았고 잘 동작하였다.

for(Vehicle vehicle:vehicles) {
	vehicle.move();
	if(vehicle instanceof Airplane) {
		((Airplane) vehicle).fly();
	}
}

고민이 되었던 부분이 해결되어서 뿌듯하다.
이맛에 공부하는 것 같다. 고민하던 수학문제 풀어내듯.. 고민하던부분해결하면 짜릿하다.

혹시 전체 코드가 필요한 사람들의 위해 소스코드를 첨부 및 깃헙 링크 첨부한다.
추상클래스, 인터페이스 구현 연습코드

public abstract class Vehicle {
	private String name;
	private int maxSpeed;
	
	abstract public void move();
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getMaxSpeed() {
		return maxSpeed;
	}
	public void setMaxSpeed(int maxSpeed) {
		this.maxSpeed = maxSpeed;
	}
	
}
public interface Flyable {
	
	void fly();

}

public class Car extends Vehicle {

	@Override
	public void move() {
		System.out.println("도로를 따라 이동 중");
		
	}
}

public class Airplane extends Vehicle implements Flyable {

	
	@Override
	public void move() {
		System.out.println("하늘을 날아가는 중");
		
	}
	
	@Override
	public void fly() {
		System.out.println("고도 10,000피트에서 비행 중");
		
	}

	
}

public class VehicleMain {

	public static void main(String[] args) {
		ArrayList<Vehicle> vehicles = new ArrayList<>();
		
		vehicles.add(new Car());
		vehicles.add(new Airplane());

		for(Vehicle vehicle:vehicles) {
			vehicle.move();
			if(vehicle instanceof Airplane) {
				((Airplane) vehicle).fly();
			}
		}

	}

}

0개의 댓글