| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 추상클래스
- 스프링
- 자바
- 성능 개선
- Spring
- 토스
- 로드밸런서
- 프로그래머스
- 계산기
- 코드카타
- Effective Java
- GoF 23
- 배치
- 스프링 배치
- 김영한
- DB
- 템플릿 메서드 패턴
- 프록시 패턴
- java
- 백엔드
- redis
- 디자인 패턴
- Til
- 이펙티브 자바
- spring boot
- Spring Batch
- 트러블슈팅
- lv1
- 빌더 패턴
- 스케줄러
Archives
- Today
- Total
김코딩
자바 - 다형성1 본문
오늘은 객체지향의 꽃이라고 불리는 다형성(Polymorphism)에 대해 정리해보려고 한다.
다형성이란?
다형성이란 말 그대로 "여러 가지 형태"를 의미한다.
자바에서는 하나의 타입으로 여러 객체(자식 클래스)를 다룰 수 있는 것을 말한다.
Parent p = new Child();
부모 타입으로 자식 객체를 담는 이 코드가 바로 다형성의 기본 형태이다.
다형적 참조
Parent parent = new Parent();
Child child = new Child();
Parent poly = new Child(); //핵심
- parent: 그냥 부모
- child: 그냥 자식
- poly: 부모 타입이지만 실제로는 자식 객체를 담고 있음 → 다형적 참조
이 때 poly.childMethod()는 호출 불가! 왜냐면 poly는 Parent 타입이기 때문이다.
자식 메서드를 호출하려면? ➡️ 다운캐스팅!
Child realChild = (Child) poly;
realChild.childMethod();
- 이렇게 하면 자식 타입의 기능까지 접근할 수 있다.
- 하지만 조심! 진짜 자식이 아닌데 캐스팅하면 ClassCastException 오류가 난다!
Parent wrong = new Parent();
Child oops = (Child) wrong; //런타임 오류
안전하게 캐스팅하려면? ➡️ instanceof 사용
if (parent instanceof Child) {
Child child = (Child) parent;
child.childMethod();
}
- instanceof를 통해 실제 타입이 맞는지 확인 후 캐스팅 가능
- 자바 16부터는 아래처럼 더 간단히 쓸 수 있다!
if (parent instanceof Child child) {
child.childMethod(); // 자동으로 캐스팅됨
}
업캐스팅 vs 다운캐스팅
| 업캐스팅 | 자식 → 부모 | 안전함 | O (자동) |
| 다운캐스팅 | 부모 → 자식 | 위험함 | X (명시적 필요) |
다형성과 메서드 오버라이딩
class Parent {
void method() {
System.out.println("Parent");
}
}
class Child extends Parent {
@Override
void method() {
System.out.println("Child");
}
}
Parent p = new Child();
p.method(); // 출력: Child
변수는 부모 타입이지만, 실제 인스턴스는 자식이기 때문에 오버라이딩된 메서드가 호출된다.
- 변수는 오버라이딩 안 됨
- 메서드는 오버라이딩 됨 → 무조건 하위 클래스 우선 실행
핵심 요약
- 부모는 자식을 참조할 수 있다 (업캐스팅)
- 자식을 쓰려면 다운캐스팅이 필요하다
- 다운캐스팅 전에는 instanceof로 타입 체크 필수!
- 오버라이딩된 메서드는 실제 인스턴스 기준으로 동작한다
마무리
다형성은 자바 객체지향에서 굉장히 중요한 개념이다.
지금은 좀 어렵게 느껴질 수 있지만, 예제와 함께 코드를 직접 실행해보면서 익숙해지면 분명 큰 무기가 될 것이다.
'Java' 카테고리의 다른 글
| 자바 - 메서드 (0) | 2025.02.26 |
|---|---|
| 자바 - 반복문 (0) | 2025.01.31 |
| 자바 - Scanner (1) | 2024.04.25 |
| 자바 - 형변환 (0) | 2024.04.25 |