오늘은 객체지향의 핵심 개념인 다형성(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) {
예외 처리 코드
}
- try 실행
- 예외 발생
- catch로 이동
- 예외 처리
4) throws
메서드 내부에서 예외를 처리하지 않고
"이 메서드는 예외가 발생할 수 있으니 호출한 쪽에서 처리하세요"
라고 알리는 키워드
public void readFile() throws IOException {
...
}
호출하는 쪽에서
try {
readFile();
} catch (IOException e) {
...
}
처럼 처리해야 함.
📌 오늘 배운 내용 정리
다형성
- 하나의 타입으로 여러 객체를 다룰 수 있음
- 업캐스팅은 자동 형변환
- 다운캐스팅은 명시적 형변환
- 다운캐스팅 전에는 instanceof 확인하기
예외처리
- 예외는 실행 중 발생하는 문제 상황
- throw로 직접 예외 발생 가능
- try-catch로 예외 처리 가능
- throws로 호출한 곳에 예외 처리 위임 가능
- RuntimeException은 컴파일러가 확인하지 않음
- Exception은 컴파일러가 확인함
'Java' 카테고리의 다른 글
| JAVA 기초정리 - 다형성 (Polymorphism) (0) | 2026.06.12 |
|---|---|
| Java 기초 정리 - 상속(Inheritance) (0) | 2026.06.11 |
| JAVA 기초 정리 - 객체지향 (final, 인터페이스, 캡슐화, 상속) (0) | 2026.06.08 |
| JAVA 기초 정리 - static과 인스턴스 멤버란? (0) | 2026.06.05 |
| JAVA 기초 정리 - 래퍼 클래스(Wrapper Class) (0) | 2026.05.21 |