목차
1. Chapter 2 - 10 : 객체지향 PART 4 - 다형성
📖 수업 목표
● 다형성이 무엇인지 학습합니다.
● 형변환이 무엇인지 학습합니다.
1. 다형성(Polymorphism)
- 하나의 타입으로 여러 객체를 다룰 수 있는 객체지향의 특징.
- 인터페이스 상속, 클래스 상속을 활용해서 추상계층 표현.
- 추상 계층이라는 특징을 활용하여 다형성 구현 가능.
* 인터페이스를 활용한 다형성
public class Main {
public static void main(String[] args) {
// 다형성 활용
Animal animal = new Cat();
animal.exist(); // ✅
animal.makeSound(); // ✅
}
}
2. 형변환(Casting)
- 부모타입으로 자식타입을 다룰 수 있는 이유는 자동으로 형변환(Casting)이 발생했기 때문.
- 자식타입 → 부모타입 : 업캐스팅(Up Casting)
→ 작은 것을 큰 것으로 옮기는 것.
- 부모타입 → 자식타입 : 다운캐스팅(Down Casting)
→ 큰 것을 작은 것으로 옮기는 것.
1) 업캐스팅(UpCasting)
- 자식 → 부모
- 부모 타입으로 자식 타입을 다룰 수 있음.
- 업캐스팅으로 인해 다형성을 활용할 수 있는 것이라고 생각하면 됨.
package chapter2.polymorphism;
public class Main {
public static void main(String[] args) {
//다형성 활용
Animal animal1 = new Cat();
Animal animal2 = new Dog();
animal1.exist();
animal2.makeSound();
animal2.exist();
animal2.makeSound();
}
}
❗업캐스팅 주의사항
- 부모의 타입으로 데이터를 다룰 수 있지만 자식 클래스의 고유 기능을 활용할 수 없음.
- 자식 클래스의 고유 기능을 사용하려면 다운캐스팅 필요.
2) 다운 캐스팅
- 부모 → 자식
- 자식 클래스의 고유 메서드 사용 가능.
public class Main {
public static void main(String[] args) {
// 다형성 활용
Animal animal = new Cat();
animal.exist();
animal.makeSound();
Cat cat = (Cat) animal; // ✅ 다운캐스팅(부모Animal -> 자식Cat)
cat.scratch(); // ✅ 자식 클래스의 기능 활용 가능
}
}
❗다운캐스팅 주의사항
- 잘못된 다운캐스팅은 컴파일 단계에서 감지할 수 없음.
- 컴파일러는 다운캐스팅이 문법적으로 올바른지 여부만 검사함.
→ 런타임 시에 실제 어떤 객체가 변수에 할당되는지 검사해주지 않음.
- 컴파일 시점에는 오류 없이 통과되지만 런타임 시점에 ClassCastException 이 발생할 가능성이 있음.
⚠️ 그래서 다운 캐스팅 사용 시 항상 instanceof를 활용해야함!!!
- instanceof는 객체가 특정 클래스나 인터페이스의 인스턴스인지 확인해주는 역할을 함.
- 주로 다운캐스팅 하기 전에 타입을 검사해서 ClassCastException 예방에 활용됨.
다형성의 장점
- 한 가지 타입으로 유연한 프로그래밍 처리 가능.
[실습과제]
💬 Q1. 클래스를 활용해서 위 내용의 3단계 계층 구조를 설계해보세요.
💡요구사항
- 다형성을 직접 활용해보세요.
- 업캐스팅과 다운캐스팅을 직접 구현해보세요.
- 다운캐스팅 시 instanceof 를 사용해보세요.
정답)
LifeForm.java
abstract class LifeForm {
public void exist() {
System.out.println("존재합니다.");
}
}
Animal.java
abstract class Animal extends LifeForm {
@Override
public void exist() {
System.out.println("동물입니다.");
}
public void makeSound() {
System.out.println("소리를 냅니다.");
}
}
Dog.java
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("멍멍");
}
public void wag() {
System.out.println("흔들흔들");
}
}
Cat.java
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("야옹");
}
public void scratch() {
System.out.println("스크래치!");
}
}
Main.java
public class Main {
public static void main(String[] args) {
Animal animal = new Cat();
animal.exist();
animal.makeSound();
// 사용불가 - 다운캐스팅 필요
// animal.scratch();
// 다운캐스팅
Cat cat = (Cat) animal;
cat.scratch();
// 다운캐스팅 주의사항
Animal animal2 = new Dog();
if (animal2 instanceof Cat) {
Cat cat2 = (Cat) animal2;
cat2.scratch();
} else {
System.out.println("고양이 객체가 아닙니다!");
}
// cat2.scratch(); 에러발생!! ClassCastException
}
}
'스파르타 내일배움캠프 > TIL(Today I learned)' 카테고리의 다른 글
25.03.11 TIL - Optional, 키오스크 과제 (2) | 2025.03.11 |
---|---|
25.03.10 TIL - 예외처리 (2) | 2025.03.10 |
25.03.06 TIL - 계산기 과제 회고 (2) | 2025.03.06 |
25.03.05 TIL - 캡슐화, 상속, 추상화 (2) | 2025.03.05 |
25.03.04 TIL - final, interface, Lv2. 계산기 과제 (3) | 2025.03.04 |