지난번 함수 오버로딩(Method overloading)에 이어서
이번글에서는 다형성(Polymorphism)에 대해서
알아보겠습니다.
다형성(Polymorphism)이라는 개념을
처음 접하신 분들이라면
단어자체만으로는 어떠한 의미를 가졌는지
감이 안 오실 거라고 생각합니다.
따라서 이 글에서는 다형성의 정확한 개념보다는
활용하는 방법 위주로 다루겠습니다.
다형성(Polymorphism)
그럼 먼저 다형성(Polymorphism)의 간단한 개념에
대해서 알아보겠습니다.
다형성은 여러가지 실체라는 의미를 가지고 있습니다.
자바에서 다형성은 한 가지 객체를 참조함으로써
다른 여러 가지 객체를 참조하는 것을 가능하게 합니다.
다형성의 가장 큰 장점은
여러 객체들을 하나의 타입으로 관리할 수 있다는
것입니다.
또한 다형성의 경우 객체들 간의 의존도를 낮추어
코드의 확장성이 커진다는 장점이 있습니다.
다형성을 활용하기 위해서는
클래스 사이의 관계가 상속관계이어야 하며
인터페이스를 사용할 시에도 다형성의 활용이
가능합니다.
instanceof
자바의 기초를 하는 단계에서는 다형성의 개념을
가장 많이 활용하는 것이 'instanceof' 연산자입니다.
instanceof는 객체 타입을 확인하는 연산자입니다.
형변환이 가능한지 여부를 판단하여 boolean(true/false)
타입으로 결과를 반환합니다.
기본 구조의 경우 '객체 instanceof 클래스'입니다.
아래 코드로 기본적인 예시를 살펴보겠습니다.
class Car{
}
class Honda extends Car{
}
class Nissan extends Car{
}
class CarBrand{
public static void main(String[] args){
Honda h = new Honda();
Nissan n = new Nissan();
Car c = new Car();
System.out.println(c instanceof Car) // true
System.out.println(h instanceof Car) // true
System.out.println(n instanceof Car) // true
System.out.println(c instanceof Honda) // false
System.out.println(n instanceof Honda) // false
System.out.println(h instanceof Honda) // true
System.out.println(c instanceof Nissan) // false
System.out.println(n instanceof Nissan) // true
System.out.println(h instanceof Nissan) // false
}
}
위 예시에서 보시는 것과 같이
Honda와 Nissan은 Car 클래스의 자식클래스이고
다형성의 특성에 따라서 Honda와 Nissan은
instanceof Car이라는 개념이 참으로 성립합니다.
하지만 Car 클래스는 Honda와 Nissan의
상위클래스이기 때문에
instanceof Honda 또는 Nissan이 거짓이라는
결과가 나오게 됩니다.
아래에서는 이러한 특성을 활용하는
예시를 한 가지 더 살펴보겠습니다.
class Car{
}
class Honda extends Car{
public String toStirng(){
return Honda;
}
}
class Nissan extends Car{
public String toString(){
return Nissan;
}
}
class CarBrand{
public static void main(String[] args){
Honda h = new Car();
Nissan n = new Car();
Car[] cars = {h, n};
for(Car c : cars){
if(c instanceof Nissan){
Nissan nissan = (Nissan) c;
System.out.println(nissan);
}else if(c instanceof Honda){
Honda honda = (Honda) c;
System.out.println(honda);
}else{
System.out.println("No honda or nissan");
}
}
}
}
위와 같이 다형성과 'instanceof'를 활용하면
데이터 구조 내의 인스턴스들을 각 타입에 따라
관리 및 활용하기에 용이합니다.
여기서 주의해야 할 것은 Honda h = new Car();
와 같은 형태로 선언할 경우 instanceof를 사용할 때
객체를 활용하기 위해서는 아래 사진과 같이
캐스팅을 해주어야 합니다.
지금까지 class 사이의 다형성에 대해서 살펴보았다면
마지막으로 인터페이스에서 작동하는 예시를
살펴보겠습니다.
public interface EngineStart{
void start(int idle);
}
class Car implements EngineStart{
public void start(int idle){
System.out.println("Car engine start");
System.out.println("rpm: " + idle);
}
}
class Motorcycle implements EngineStart{
public void start(int idle){
System.out.println("Motorcycle engine start");
System.out.println("rpm: " + idle);
}
}
class Vehicle{
public void static main(String[] args){
Car c = new Car();
Motorcycle m = new Motorcycle();
if (c instanceof EngineStart){
c.start();
}
if (m instanceof EngineStart){
m.start();
}
}
}
위 코드를 작동시켜 보면 Car 클래스와 Motorcycle 클래스
모두 EngineStart 인터페이스를 implement 하고 있고
instanceof를 통해 각각 다른 클래스를 참조가능함을
알 수 있습니다.
따라서 완전히 상속관계가 아니더라도 같은 인터페이스를
공유하는 클래스의 객체들 사이에서도 instanceof를
활용가능합니다.
지금까지 다형성(Polymorphism)과 instanceof 연산자에
대해서 알아보았습니다.
이 두 가지 개념은 객체들을 관리하고 활용할 때
용이한 개념으로 꼭 이해하고 활용할 수 있는 상태까지
연습해야 한다고 생각합니다!
다음 글에서는 인터페이스(Interface)에 대해서
알아보겠습니다.
'자바(JAVA) 기초 함께 알아보자' 카테고리의 다른 글
자바(JAVA) 기초 함께 알아보자(26) - 추상 클래스/추상 메소드 (abstract) (0) | 2025.02.11 |
---|---|
자바(JAVA) 기초 함께 알아보자(25) - 다중 상속 / 인터페이스(Interface) (0) | 2025.02.09 |
자바(JAVA) 기초 함께 알아보자(23) - 함수 오버로딩(Method Overloading) (2) | 2025.01.16 |
자바(JAVA) 기초 함께 알아보자(22) - 열거형(Enumeration) (0) | 2025.01.14 |
자바(JAVA) 기초 함께 알아보자(21) - 상수(Constant) / static (0) | 2025.01.08 |