본문 바로가기
Java/기본 개념 및 클래스

[Java] 43. 다형성과 캐스팅

글: Song hyun 2024. 4. 24.
728x90
반응형

[Java] 43. 다형성과 캐스팅

1. 다형성의 개념

2. 업캐스팅과 다운캐스팅

3. 다형성과 캐스팅의 활용


 

1. 다형성의 개념

(1) 다형성(Polymorphism)은 하나의 데이터 타입을 다양한 형태로 바라볼 수 있는 개념을 뜻한다.
-다형성은 객체 지향 패러다임에서 중요한 개념 중 하나로, 

이는 한 요소(메서드, 클래스)가 여러 형태를 가질 수 있는 등력을 뜻한다.
-다형성은 코드의 유연성과 재사용성을 높이며, 이러한 개념은 상속/추상화/인터페이스에서 많이 쓰인다.

 

-컴파일 시점에서는 문법적인 오류만을 확인하고, 런타임 시점에서 실제 객체가 만들어진다.

 


2. 업캐스팅과 다운캐스팅

업캐스팅/다운캐스팅은 객체 지향 패러다임에서 다형성을 활용할 때 사용되는 개념이다.

(1) 업캐스팅(Upcasting)
-업캐스팅은 부모클래스의 참조변수로 자식 클래스의 객체를 참조하는 것을 말한다.
-부모 클래스의 데이터 타입으로 자식 클래스의 객체를 대입하는 것을 의미한다.
-업캐스팅은 자동으로 이루어진다.

Animal animal=new Dog(); // 업캐스팅

 

 

(2) 다운캐스팅(Downcasting)
-다운캐스팅은 부모 클래스의 참조 변수를 자식 클래스의 객체로 변환하는 것을 말한다.
-다운캐스팅은 명시적으로 형변환을 해야한다. (=강제 형 변환과 유사하다.)
-다운캐스팅은 업캐스팅된 객체가 실제로 자식 클래스의 객체일 때만 가능하다.
그렇지 않으면 ClassCastException(예외)가 발생할 수 있다.

((Human)animal).readBooks();

 


3. 다형성과 캐스팅의 활용

*Instanceof 연산자: 실행 시점에 객체가 특정 클래스의 인스턴스인지 확인하는 키워드이다.

 

아래의 코드를 살펴보자.

각각 Banana/Peach 클래스에 새로운 객체를 생성한 뒤,

Fruit형 변수들을 받는 배열 fruits에 순서대로 넣었다는 것을 알 수 있다.

 

(1) 이처럼 Banana/Peach 클래스 소속인 두 변수가

Fruit형을 담는 배열에 들어갈 수 있던 이유는 다형성 때문이라고 할 수 있다.

 

Banana/Peach 클래스 두 개 모두 Fruit 클래스에게서 상속받고 있기 때문에,

Fruit 자료형으로도 호출이 가능해지는 것이다.

 

(2) 두번째로는 캐스팅을 통해, banana 내부의 origin 요소를 출력하는 것이다.

이 때 origin은 Fruit 클래스가 아닌 Banana 클래스에서만 존재하는 변수이다.

 

banana의 속성 origin의 경우는 private으로 외부 접근을 막고 있기 때문에,

직접 호출이 아닌 다른 방법으로 접근해야 한다. 이 때 방식은 두 가지가 있는데, 

 

-첫

package basic.ch20;

public class FruitTest {
	public static void main(String[] args) {
		
		//다형성
		//다양한 형태로 클래스, 또는 데이터 타입을 바라볼 수 있다.
		
		Fruit fruit1=new Banana(); //업캐스팅: 부모의 데이터 타입으로 자식 클래스의 객체 대입
		Fruit fruit2=new Peach(); 
		Banana banana=new Banana(); //업캐스팅: 부모의 데이터 타입으로 자식 클래스의 객체 대입
		Peach peach=new Peach(); 
		
		fruit1.showinfo();
		fruit2.showinfo();
		
		System.out.println("------------");
		
		// 다형성을 사용하면
		// 코드를 유연하게 사용할 수 있다.
		Fruit[] fruits=new Fruit[4];
		fruits[0]=fruit1;
		fruits[1]=fruit2;
		fruits[2]=banana;
		fruits[3]=peach;		
		
	}

}
package basic.ch20;

public class Fruit {
	String name;
	int price;
	
	public void showinfo() {
		System.out.println("상품명 : "+this.name);
		System.out.println("상품 가격 : "+this.price);
	}
}
package basic.ch20;

public class Banana extends Fruit{
	
	String origin;
	
	public Banana() {
		name="춘식이바나나";
		price=5_000;
		origin="한국";
	}
	
	public void saleBanana() {
		System.out.println("바나나 가격을 할인합니다.");
		price-=1_000;
	}

}
package basic.ch20;

public class Peach extends Fruit{

	public Peach() {
		name="복숭아";
		price=8_000;
	}

}
728x90
반응형