Java/자바기본개념

다형성이란?

유호야 2020. 12. 15. 01:11
반응형

1. 다형성이란?

1) 사전적 의미 : 다양한 형태의 성질을 갖는것

2) 객체를 사용할 때 쓰는 참조변수를 형태를 바꿔서 여러가지 타입의 객체를 참조할 수 있습니다.

3) 장점은 프로그램 코드를 유연하게 구성할 수 있습니다.

이후에 Spring 프레임워크나 다양한 요소에 쓰이는 다형성과 형변환은 java에서 정말 중요한 요소중에 하나인데요. 이렇게 중요한 기능을 예제를 통해서 한번 알아보도록 하겠습니다.

class Fruit() {

}

class Apple() extends Fruit{

}	

다음과 같이 Fruit클래스와 이를 상속받는 Apple 클래스가 있습니다.

여태까지 우리는 이를 가지고 객체를 생성할 때 다음과 같이 정의하였습니다.

Apple apple = new Apple();

Apple 타입의 a라는 참조변수를 생성하고 메모리에 적재된 Apple () 객체를 가리켜 값을 가져오는 방법이었습니다.

하지만 클래스간의 상속 관계일때는 다음과 같은 표기도 가능합니다.

Fruit fruit = new Apple();

이는 Fruit타입의 f라는 참조변수를 선언후 메모리에 올라간 Apple () 객체를 가르키도록 한 것입니다.

 

하지만 이경우는 Fruit타입의 참조변수를 사용 했음으로 Apple 에서는 Fruit에서 상속받은 인자들만 가져올 수 있습니다.

가져올 수 있는 공간이 없으며 구조상 Apple > Fruit이기 때문이지요.

Apple apple = new Fruit();

다음과 같은 경우는 어떨까요 물론 에러가 납니다. Apple 타입의 참조변수가 Fruit보다 가지고 있는 인자가 많기 때문에 에러가 납니다.

Fruit의 구성요소가 Apple 에는 있지만 Apple 의 구성요소는 Fruit에 없기 때문이라고 보시면 될것 같습니다.

즉 Big extends Small 이라면 Small s = new Big(); 는 가능하지만 Big b = new Small() 경우 에러가 납니다.

하지만 형변환을 통한 다형성을 구현한다면 어떨까요?

2. 다형성 예제

class Fruit {

}

class Apple extends Fruit {

}

class ProductStatus{
	public static void main(String[] args) {
    	Fruit fruit = new Apple();
        
        Apple apple = null;
        
        apple = (Apple)fruit;
    }
}

(Apple) 다음의 캐스팅을 통해 Fruit 타입의 f 참조변수를 Apple a로 바꾼 모습입니다.

다음은 이에 관한 예제 입니다.

class Fruit {

	int price;
    
    void stock(){
    	System.out.println()
    }
}

class Apple extends Fruit {

	String madein;
    
    void eats(String name) {
    	System.out.println(name + "맛있습니다.");
	}
}

public class FruitStatus {
	public static void main(String[] args) {
    	Fruit fruit = new Apple();
        Apple apple = null;
        fruit.price = 100;
        apple = (Apple)fruit;
        System.out.println(apple.price);
	}
}

3. 소스 구동 결과

100

 

 

출처 : ontheinfo.com/2364

 

반응형