이번 시간에는 자바 다형성 기능에 대해 알아보겠습니다.
1. 다형성이란?
1) 사전적 의미 : 다양한 형태의 성질을 갖는것
2) 객체를 사용할 때 쓰는 참조변수를 형태를 바꿔서 여러가지 타입의 객체를 참조할 수 있습니다.
3) 장점은 프로그램 코드를 유연하게 구성할 수 있습니다.
이후에 Spring 프레임워크나 다양한 요소에 쓰이는 다형성과 형변환은 java에서 정말 중요한 요소중에 하나인데요. 이렇게 중요한 기능을 예제를 통해서 한번 알아보도록 하겠습니다.
다음과 같이 Fruit클래스와 이를 상속받는 Apple 클래스가 있습니다.
여태까지 우리는 이를 가지고 객체를 생성할 때 다음과 같이 정의하였습니다.
Apple a = new Apple ();
Apple 타입의 a라는 참조변수를 생성하고 메모리에 적재된 Apple () 객체를 가리켜 값을 가져오는 방법이었습니다.
하지만 클래스간의 상속 관계일때는 다음과 같은 표기도 가능합니다.
Fruit f = new Apple ();
이는 Fruit타입의 f라는 참조변수를 선언후 메모리에 올라간 Apple () 객체를 가르키도록 한 것입니다.
하지만 이경우는 Fruit타입의 참조변수를 사용 했음으로 Apple 에서는 Fruit에서 상속받은 인자들만 가져올 수 있습니다.
가져올 수 있는 공간이 없으며 구조상 Apple > Fruit이기 때문이지요.
Apple a = new Fruit();
다음과 같은 경우는 어떨까요 물론 에러가 납니다. Apple 타입의 참조변수가 Fruit보다 가지고 있는 인자가 많기 때문에 에러가 납니다.
Fruit의 구성요소가 Apple 에는 있지만 Apple 의 구성요소는 Fruit에 없기 때문이라고 보시면 될것 같습니다.
즉 Big extends Small 이라면 Small s = new Big(); 는 가능하지만 Big b = new Small() 경우 에러가 납니다.
하지만 형변환을 통한 다형성을 구현한다면 어떨까요?
2. 다형성 예제
(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 f = new Apple(); Apple a = null; f.price = 100; a = (Apple)f; System.out.println(a.price); } }
3. 소스 구동 결과
4. 형변환의 잘못된 예제
다음과 같은 경우에는 에러가 발생하게 됩니다.
f를 Apple 타입으로 변경에 a에 할당하였으나 f = new Fuit() 이므로 결국은 Apple a = new Fruit()와 같은형태가 되어 에러가 발생하게 됩니다.
위와 같이 클래스캐스트 이셉션이 발생한 모습입니다.
사실 자바 다형성 기능을 몰라도 실제 업무를 진행하는데 어려움을 겪진 않습니다.
하지만 프로젝트에서 많이 쓰이는 spring 프레임워크의 구조가 다형성 기반으로 되있다 보니 알아두면 좋을 것 같습니다.
자바초보
안녕하세요 자바다형성 과 형변환 공부하러 왔다가 폰트가 예뻐서 저도 써볼까 하고 질문 해봅니다 폰트 어떤건지 알 수 있을까요???
자바초보
알아보니 모나코 폰트 같군요 좋은 하루 되세요~~
관리자
네 모나코 맞습니다. ^^