반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
Tags
- 문자열
- Visual Studio Code
- IntelliJ
- 자바스크립트
- Java
- 인텔리제이
- HashMap
- input
- junit
- ArrayList
- math
- list
- 배열
- junit5
- vscode
- Eclipse
- 자바문법
- CSS
- 테스트자동화
- 이클립스
- html
- 정규식
- 단위테스트
- js
- java테스트
- string
- 자바
- Array
- json
- javascript
Archives
- Today
- Total
어제 오늘 내일
[Java] 다형성(Polymorphism) 이해하기 본문
Java에서 다형성(Polymorphism)은 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나로,
같은 타입(부모 타입)으로 다양한 형태(자식 객체)를 다룰 수 있는 능력을 말합니다.
즉, 하나의 타입이 여러 동작을 수행할 수 있도록 만드는 강력한 기능입니다.
1. 다형성이란?
다형성은 여러 형태를 갖는다라는 의미로, Java에서는 다음과 같은 상황에서 나타납니다:
- 부모 타입 변수로 자식 객체를 참조할 수 있다
- 오버라이딩된 메서드는 실제 객체 타입 기준으로 실행된다
형식:
부모클래스 변수 = new 자식클래스();
예:
Animal a = new Dog();
Animal b = new Cat();
설명
- 같은 Animal 타입이지만, 실제 객체는 Dog 또는 Cat
- 실제 객체 타입에 따라 동작이 달라짐
2. 다형성의 핵심: 오버라이딩된 메서드 실행
부모 타입으로 호출해도, 실제 객체의 메서드가 실행됩니다.
class Animal {
void sound() {
System.out.println("동물 소리");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹");
}
}
사용:
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.sound(); // 멍멍
a2.sound(); // 야옹
설명
- 변수 타입은 Animal
- 실제 객체는 Dog 또는 Cat
- 실행되는 메서드는 객체의 실제 타입 기준
3. 다형성을 사용하는 이유
✔ 코드 재사용성 증가
부모 타입으로 여러 자식 객체를 하나의 구조로 처리 가능
✔ 유지보수 쉬움
공통 기능은 부모에서 제공, 각기 다른 동작은 자식에서 구현
✔ 확장성 강화
새로운 자식 클래스 추가해도 기존 코드를 수정할 필요가 적음
예:
void makeSound(Animal a) {
a.sound(); // 어떤 동물인지 상관없이 sound() 실행
}
4. 다형성과 형변환 (업캐스팅)
다형성은 업캐스팅을 전제로 합니다.
Animal a = new Dog(); // 업캐스팅
특징
- 부모 타입으로 자식 객체를 담음
- 부모가 가진 메서드만 호출할 수 있음 (자식의 고유 메서드는 호출 불가)
a.bark(); // ❌ 오류
5. 다형성과 다운캐스팅
부모 타입으로 참조했지만, 실제 자식 기능이 필요할 때는 다운캐스팅을 사용합니다.
Animal a = new Dog();
if (a instanceof Dog) {
Dog d = (Dog) a;
d.bark(); // 자식 메서드 호출 가능
}
6. 다형성이 잘 활용되는 예 (전략 패턴 느낌)
class Animal {
void sound() { }
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹");
}
}
public class Main {
static void printSound(Animal animal) {
animal.sound();
}
public static void main(String[] args) {
printSound(new Dog());
printSound(new Cat());
}
}
출력:
멍멍
야옹
설명
- 메서드 하나로 여러 타입의 객체 동작을 처리
- 다형성이 없었다면 동물 종류별로 조건문이 필요했을 것
7. 오버로딩과의 차이
| 개념 | 다형성(오버라이딩 기반) | 오버로딩 |
| 목적 | 실제 객체 타입에 따라 다른 동작 | 같은 이름, 다른 파라미터 |
| 실행 기준 | 객체의 실제 타입 | 컴파일 시 결정 |
| 대표 사용 | 상속 + 오버라이딩 | 메서드 이름 재사용 |
다형성은 런타임 동작이 결정되는 반면, 오버로딩은 컴파일타임에 결정됩니다.
8. 정리
- 다형성은 “하나의 부모 타입으로 여러 자식 객체를 다루는 능력”
- 부모 타입 변수로 자식 객체를 담아 사용
- 오버라이딩된 메서드가 실제 객체 기준으로 실행
- 코드 유연성·확장성·재사용성 모두 향상
반응형
'IT > Java' 카테고리의 다른 글
| [Java] 객체지향 4대 원칙 정리 (상속, 추상화, 캡슐화, 다형성) (0) | 2025.12.27 |
|---|---|
| [Java] 캡슐화(Encapsulation)란? (0) | 2025.12.27 |
| [Java] this 키워드 사용법 (0) | 2025.12.26 |
| [Java] static 변수와 static 메서드 차이 (0) | 2025.12.25 |
| [Java] final 키워드 (변수, 메서드, 클래스) (0) | 2025.12.25 |
Comments
