Java

JAVA 기초정리 - 다형성과 예외처리

chungmani 2026. 6. 9. 20:39

 

오늘은 객체지향의 핵심 개념인 다형성(Polymorphism) 과 프로그램의 안정성을 높여주는 예외처리(Exception Handling) 에 대해 정리해보려고 함!


1. 다형성(Polymorphism)

다형성이란?

하나의 타입으로 여러 객체를 다룰 수 있는 것

 

객체지향 프로그래밍의 대표적인 특징 중 하나임.

예를 들어 강아지와 고양이가 모두 동물이라면,

Animal animal1 = new Dog();
Animal animal2 = new Cat();
 

처럼 부모 타입인 Animal 하나로 여러 자식 객체를 다룰 수 있음.

 

1) 업캐스팅 (Up Casting)

자식 객체를 부모 타입으로 다루는 것

Animal animal = new Dog();
 

사실상 다형성의 시작점이라고 볼 수 있음.

특징

  • 자동으로 형변환됨
  • 안전함
  • 부모가 가진 기능만 사용 가능
animal.eat();  // 가능

 

 

 
animal.tail(); // 불가능

 

 

 

왜냐하면 tail()은 Dog만 가지고 있는 기능이기 때문.


2) 다운캐스팅 (Down Casting)

부모 타입으로 참조 중인 객체를 다시 자식 타입으로 변환하는 것

Animal animal = new Dog();

Dog dog = (Dog) animal;
dog.tail();
 

이제 Dog의 고유 기능도 사용할 수 있음.

 

⚠️ 다운캐스팅 시 주의점

무조건 다운캐스팅하면 위험함.

예를 들어

Animal animal = new Cat();

Dog dog = (Dog) animal;
 

이렇게 하면 실행 중 오류 발생!

ClassCastException
 

3) instanceof 활용하기

다운캐스팅 전에는 해당 객체가 정말 원하는 타입인지 확인하는 습관을 들이는 것이 좋음.

if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.tail();
} else {
    System.out.println("객체가 강아지가 아닙니다.");
}
 

instanceof란?

"이 객체가 해당 타입이 맞나요?" 를 확인하는 연산자.
결과는 true 또는 false로 반환됨.

 

🎯 다형성을 사용하는 이유

만약 다형성이 없다면

Dog dog = new Dog();
Cat cat = new Cat();
Bird bird = new Bird();
 

각 타입마다 따로 관리해야 함.

 

 

하지만 다형성을 사용하면

List<Animal> animals = new ArrayList<>();

animals.add(new Dog());
animals.add(new Cat());
animals.add(new Bird());
 

처럼 하나의 타입으로 관리할 수 있음.

코드가 훨씬 유연해지고 확장성이 좋아짐.

 


2. 예외 처리(Exception)

예외란?

프로그램 실행 중 발생하는 예상치 못한 문제

 

예외를 처리하지 않으면 프로그램이 강제로 종료될 수 있음.

 

 

예시

int result = 10 / 0;
 

 

실행 결과

ArithmeticException
 

0으로 나누는 것은 불가능하기 때문에 예외 발생.

 

1) throw

의도적으로 예외를 발생시키고 싶을 때 사용

if (money < amount) {
    throw new IllegalArgumentException("잔액 부족");
}
 

 

 

위 코드는

잔액이 부족한 상태로 결제를 시도하면
프로그램에게 예외를 발생시켜라
 

라는 의미.

실무에서도 굉장히 자주 사용됨.

 

2) 예외의 종류

1️⃣ RuntimeException

컴파일러가 확인하지 않는 예외

int result = 10 / 0;
 

같은 코드도 컴파일은 통과함.

 

하지만 실행 중에 오류 발생.

대표 예시

  • NullPointerException
  • IllegalArgumentException
  • ArithmeticException
  • ClassCastException

2️⃣ Exception

컴파일러가 확인하는 예외

예외 처리를 하지 않으면 컴파일 자체가 안 됨.

대표 예시

IOException
 
SQLException
 

 

3) try - catch

예외가 발생해도 프로그램이 종료되지 않도록 처리하는 방법

try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("0으로 나눌 수 없습니다.");
}
 

 

실행 결과

0으로 나눌 수 없습니다.
 

프로그램이 강제 종료되지 않음.

 

흐름 이해하기

try {
    문제 발생 가능 코드
} catch (예외 타입 e) {
    예외 처리 코드
}
 
  1. try 실행
  2. 예외 발생
  3. catch로 이동
  4. 예외 처리

4) throws

메서드 내부에서 예외를 처리하지 않고

"이 메서드는 예외가 발생할 수 있으니 호출한 쪽에서 처리하세요"

라고 알리는 키워드

public void readFile() throws IOException {
    ...
}
 

호출하는 쪽에서

try {
    readFile();
} catch (IOException e) {
    ...
}
 

처럼 처리해야 함.

 


📌 오늘 배운 내용 정리

다형성

  • 하나의 타입으로 여러 객체를 다룰 수 있음
  • 업캐스팅은 자동 형변환
  • 다운캐스팅은 명시적 형변환
  • 다운캐스팅 전에는 instanceof 확인하기

예외처리

  • 예외는 실행 중 발생하는 문제 상황
  • throw로 직접 예외 발생 가능
  • try-catch로 예외 처리 가능
  • throws로 호출한 곳에 예외 처리 위임 가능
  • RuntimeException은 컴파일러가 확인하지 않음
  • Exception은 컴파일러가 확인함