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();
}
}
}