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
'Java > 자바기본개념' 카테고리의 다른 글
[자바] ^ 연산자를 이용한 간단한 암호화 (0) | 2022.12.31 |
---|---|
List와 Map의 차이 (0) | 2021.06.27 |
[JAVA] nextLine()이 안 될 때 (0) | 2021.05.26 |
Stack, Heap차이 / 캡슐화 / 응집도 / 결합도 / OOP / 자료구조 (0) | 2021.02.23 |
추상클래스, 추상메소드 (0) | 2020.12.12 |