본문 바로가기
Programming/Java

[자바/Java] 다형성(Polymorphism)

by 코딩하는 랄로 2023. 10. 6.
728x90

다형성이란?

다형성이란 자바의 주요 개념 중 하나로 여러개를 의미하는 poly와 형태 또는 실체를 의미하는 morphism의 결합어이다. 즉, 자바에서 다형성(polymorphism)이란 하나의 이름의 클래스나 메소드가 '여러 가지 형태의 동작을 하는 능력'이다.

 

메소드의 다형성은 이전에 배웠던 같은 클래스 내에서의 메소드 오버로딩, 상속 관계에서의 메소드 오버라이딩이 이에 해당한다. 

 

클래스의 다형성은 한 타입의 참조 변수로 여러 타입의 객체를 참조하는 것이 가능하게 한다. 즉, 상속 관계에서 조상클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하는 것이 가능한 것이다.

 

클래스의 다형성은 다음과 같은 조건에서 성립한다.

  • 상위 클래스와 하위 클래스가 상속관계여야 한다.
  • 다형성이 보장되기 위해 오버라이딩(하위 클래스의 메서드의 재정의)이 반드시 필요
  • 자식 클래스의 객체가 부모 클래스의 타입으로 형변환해야 한다.

 

 

 

다형성의 이점

자바에서 다형성이 중요한 개념인 이유는 다형성의 이점이 자바의 객체 지향적인 면과 연관이 있기 때문이다. 자바는 객체지향언어 이기 때문에 코드의 재사용성 등 여러 이점을 가지는 데 이러한 장점을 가지도록 도와주는 것이 바로 다형성이기 때문이다.

 

  • 유지 보수 : 여러 객체를 하나의 타입으로 관리할 수 있어 유지보수가 용이하다.
  • 재사용성 : 객체의 재사용이 쉬워 재사용성이 높아진다.
  • 느슨한 결합 : 클래스 간의 의존성을 줄여 확장성은 높아지고 결합도는 낮아진다.

 

 

 

형변환(캐스팅)

자바에서는 기본 자료형 뿐만이 아니라 참조 변수도 형 변환이 가능하다. 참조 변수의 형 변환을 하기 위한 조건으로는 다음과 같다.

 

  • 서로 상속관계에 있는 상위 클래스 : 하위 클래스 사이에만 형 변환이 가능하다
  • 업 캐스팅(하위 클래스 타입에서 상위 클래스 타입으로 형 변환)은 형 변환 연산자를 생략 가능
  • 다운 캐스팅(상위 클래스에서 하위 클래스 타입으로 변환)은 형 변환 연산자를 반드시 명시

 

다음의 예시는 생략이 가능한 경우이다.

class Vehicle {
    public void info() {
        System.out.println("이동수단");
    }
}

class Car extends Vehicle {
    public void info() {
        System.out.println("이동수단 : 자동차");
    }
}

class HybridCar extends Car {
    public void info() {
        System.out.println("이동수단 : 자동차 : 하이브리드");
    }
}

public class PolymorphismEx {
    public static void main(String[] args) {

        // 객체 타입과 참조변수 타입이 불일치
        Vehicle car1 = new Car();
        Vehicle car2 = new HybridCar();
        Car car3 = new HybridCar();

        car1.info();  //이동수단 : 자동차
        car2.info();  //이동수단 : 자동차 : 하이브리드
        car3.info();  //이동수단 : 자동차 : 하이브리드
    }
}

상위 클래스 타입의 참조 변수로 하위 클래스의 객체를 참조하는 다형성의 핵심적인 부분이다.

 

 

생략이 불가능한 경우는 다음과 같이 다운 캐스팅을 하는 경우이다.

class Vehicle {
    public void info() {
        System.out.println("이동수단");
    }
}

class Car extends Vehicle {
    public void info() {
        System.out.println("이동수단 : 자동차");
    }
}

class HybridCar extends Car {
    public void info() {
        System.out.println("이동수단 : 자동차 : 하이브리드");
    }
}

public class PolymorphismEx {
    public static void main(String[] args) {
        Car car1 = new Car();
        
        //생략가능
        Vehicle car2 = car1;  // == (Vehicle)car1
        
        //생략불가능
        HybridCar car3 = (HybridCar) car1

        car1.info();  //이동수단 : 자동차
        car2.info();  //이동수단
        car3.info();  //이동수단 : 자동차 : 하이브리드
    }
}

 

 

 

instanceof 연산자

instanceof 연산자는 참조 변수의 형 변환이 가능한 지의 여부를 boolean 타입으로 확인할 수 있는 자바의 문법 요소이다.

즉, 해당 참조 변수가 어떤 타입을 포함하고 있는지 알 수 있다.(자식 클래스는 부모 클래스들의 타입을 모두 가지고 있음)

 

참조변수 instanceof 타입

 

class Vehicle {
}

class Car extends Vehicle {
}

class HybridCar extends Car {
}

public class PolymorphismEx {
    public static void main(String[] args) {
        Car car1 = new Car();
        
        System.out.println(car1 instanceof Object);    //true
        System.out.println(car1 instanceof Car);       //true
        System.out.println(car1 instanceof Vehicle);   //true
        System.out.println(car1 instanceof HybridCar); //false    

    }
}
728x90

'Programming > Java' 카테고리의 다른 글

[자바/Java] 예외(Exception)  (1) 2023.10.08
[자바/Java] 추상클래스 && 인터페이스  (1) 2023.10.06
[자바/Java] 상속(inheritance)  (0) 2023.09.29
[자바/Java] 클래스  (0) 2023.09.29
[자바/Java] 메소드5 - 재귀 호출  (0) 2023.09.29