본문 바로가기
Java/객체 지향

객체 지향 원칙 4 - 다형성(Polymorphism)

by 정구정구 2026. 6. 4.

다형성

  • 하나의 타입으로 여러 객체를 다룰 수 있는 객체지향의 특징
  • 추상 계층을 활용해서 다형성을 구현 가능

 

 

인터페이스를 활용한 다형성

public interface GameObject 
{
    void exist();
}
public interface Movable extends GameObject 
{
    void move();
}
public class Monster implements Movable 
{
    @Override
    public void move() 
    {
        System.out.println("왼쪽으로 간다.");
    }

    @Override
    public void exist() 
    {
        System.out.println("몬스터가 존재한다.");
    }

    public void attack() 
    {
        System.out.println("몬스터가 공격한다.");
    }
}
public class Player implements Movable 
{
    @Override
    public void move() 
    {
        System.out.println("오른쪽으로 간다.");
    }

    @Override
    public void exist() 
    {
        System.out.println("플레이어가 존재한다.");
    }

    public void magic() 
    {
        System.out.println("플레이어가 마법을 쓴다.");
    }
}
public class Main 
{
    public static void main(String[] args) 
    {
        // 다형성 활용
        Movable movable = new Movable();
        movable.exist(); 
        movable.move();
    }
}

 

 

 

형변환(Casting)

업 캐스팅

  • 자식 타입 -> 부모 타입 캐스팅
  • 부모 타입으로 데이터를 다룰 수 있지만, 자식 클래스의 고유 기능 활용 불가능.
public class Main 
{
    public static void main(String[] args) 
    {
        // 다형성 활용
        Movable movable = new Monster(); // 업 캐스팅
        movable.exist(); 
        movable.move(); 
        movable.attack(); // ❌ 사용 불가
    }
}

 

 

다운 캐스팅

  • 부모 타입 -> 자식 타입 캐스팅
  • 잘못된 다운 캐스팅은 컴파일 단계에서 감지할 수 없음 (ClassCastException 발생 가능성)
public class Main 
{
    public static void main(String[] args) 
    {
        // 다형성 활용
        Movable movable = new Monster();
        movable.exist();
        movable.move();
        
        Monster monster = (Monster) movable; // 다운캐스팅
        monster.attack(); // 자식 클래스의 기능 활용 가능
    }
}

 

  • instanceof 키워드를 통해 ClassCastException를 예방
public class Main 
{
    public static void main(String[] args) 
    {
        Movable movable = new Monster();

        // ✅ 안전한 다운캐스팅(movable이 Monster의 인스턴스 유형인지 확인)
        if (movable instanceof Monster) 
        {
            Monster monster = (Monster) movable;
            monster.attack();
        } 
        else 
        {
            System.out.println("객체가 인터페이스의 인스턴스가 아닙니다.");
        }
    }
}

 

 

 

다형성을 이용한 예시 코드

public class Main 
{
    public static void main(String[] args) 
    {
        Movable[] movables = {new Player(), new Monster()};
        
        for (Movable movable : movables) // 움직일 수 있는 모든 오브젝트 이동
        {
            movable.move();
        }
    }
}