다형성이란?
다형성은 Java에서 객체 지향 프로그래밍의 기본 개념 중 하나입니다. 다양한 형태나 유형을 취할 수 있는 객체의 능력을 나타냅니다. 서로 다른 클래스의 개체를 공통 상위 클래스의 개체인 것처럼 처리할 수 있습니다.
굉장히 추상적인 설명이기 때문에 예제를 확인하는 것이 베스트 입니다.
예제
overloading
class O{
public void a(int param){
System.out.println("숫자출력");
System.out.println(param);
}
public void a(String param){
System.out.println("문자출력");
System.out.println(param);
}
}
public class PolymorphismOverloadingDemo {
public static void main(String[] args) {
O o = new O();
o.a(1);;
o.a("one");
}
}
a 메소드에 매개변수만 변경하여 사용할 수 있게 했습니다. 같은 이름의 메소드에 다른 매개변수가 들어간다가 이제 다형성이라고 할 수 있습니다.
참조변수와 인스턴스 변수 연결
public class Main {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println(p.x); // prints 200
System.out.println(c.x); // prints 100
p.method(); // prints "Child Method"
c.method(); // prints "Child Method"
}
}
class Parent {
int x = 200;
void method(){
System.out.println("Parent Method");
}
}
class Child extends Parent {
int x = 100;
void method(){
System.out.println("Child Method");
}
}
Parent 와 Child 를 둘다 child 클래스로 생성하고 같은 함수를 실행해봤습니다. 실행 결과는.... Child 메소드의 값만 나오게 되네요.
이것으로 확인해 볼 수 있는 것은 Parent 참조 변수로 불러온 p에 자신보다 큰 Child 인스턴스로 생성을 하게되면 overriding이 되면서 method() 함수의 값이 Child 클래스에 있는 값으로 변경되게 됩니다.
형변환
기본형 변수도 작은것이 큰것에 포함될 수 있는 것처럼 class도 작은 것이 큰 것에 포함 될 수 있습니다.
public class Car{
public void run(){
System.out.println("Car의 run메소드");
}
}
public class Bus extends Car{
public void ppangppang(){
System.out.println("빵빵.");
}
}
public class BusExam{
public static void main(String args[]){
Car car = new Bus();
car.run();
car.ppangppang(); // 컴파일 오류 발생
}
}
Car 참조형 변수이기 때문에 car.ppangppang() 메소드는 사용할 수 없습니다. 왜냐하면 작은 범주에 있는 Car에는 빵빵 메소드가 없기 때문입니다. 그래서 형변환을 통해서 사용가능하게 만들면 됩니다.
public class BusExam{
public static void main(String args[]){
Car car = new Bus();
car.run();
//car.ppangppang(); // 컴파일 오류 발생
Bus bus = (Bus)car; //부모타입을 자식타입으로 형변환
bus.run();
bus.ppangppang();
}
}
부모의 타입을 자식의 타입으로 형변환하여 빵빵 메소드를 사용할 수 있게 했습니다. 이것을 다운 캐스팅이라고 하고, 반대의 경우를 업캐스팅이라고 하는데, 자식의 타입을 부모의 타입으로 바꾸는 것은 다른 명령어 필요없이 그냥 bus = car; 이라고 작성하면 됩니다.
자손타입 -> 조상타입 (up casting) 생략가능
조상타입 -> 자손타입 (down casting) 생략불가능
instanceof 메소드
class Parent{}
class Child extends Parent{}
public class InstanceofTest {
public static void main(String[] args){
Parent parent = new Parent();
Child child = new Child();
System.out.println( parent instanceof Parent ); // true
System.out.println( child instanceof Parent ); // true
System.out.println( parent instanceof Child ); // false
System.out.println( child instanceof Child ); // true
}
}
이것은 포함관계를 참과 거짓으로 판결해주는 함수입니다. 위의 예시를 보시면 확 와닿지 않습니까?
첫 번째 줄부터 쭉 설명해보겠습니다.
부모가 부모의 포함하나요?
자식이 부모를 포함하나요?
부모가 자식을 포함하나요?
자식이 자식을 포함하나요?
라는 느낌입니다.
이정도를 기본으로 하고 나중에 필요하다면 여러 종류의 객체를 배열에 저장하는 것에 대해 알아보도록 하죠.
소감
다형성을 이용해서 기능을 숨기거나 override, overload 할 수 있습니다. 처음 사용해 보면 이해가 잘 되지 않습니다. 하지만 이런 예시를 보면 또 이해가 갑니다. 핸드폰의 기능 중에 어린이 보호 기능이 있다고 생각하면, 어머니가 사용할 때는 보호기능을 끄고, 아이가 사용할 때는 보호 기능을 켜서 사용하면 핸드폰을 안전하게 사용할 수 있습니다.
저는 형변환을 통해서 보호모드로 사용할지 아닐지를 결정해서 핸드폰의 메소드들을 잠구거나 풀거나를 할 수 있다고 생각하니 이해가 조금 되었습니다.
여러분들도 여러가지 예시를 통해서 이해하면 좋습니다.
출처
'코딩 개발 > Java' 카테고리의 다른 글
Java - abstract (추상클래스, 추상 메소드) (0) | 2023.04.09 |
---|---|
Java - Static (feat. final, metaspace) (0) | 2023.04.09 |
Java - 상속(Inheritance) (0) | 2023.04.09 |
Java - Array(배열) (0) | 2023.04.07 |
Java - UML 다이어그램 (0) | 2023.04.05 |