Back-End/Java
07. 상속과 다형성
Yerin Thea Yoo
2026. 2. 11. 23:32
Java는 객체지향 언어다.
객체지향의 핵심 개념 중 가장 중요한 두 가지가 상속(Inheritance)과 다형성(Polymorphism)이다.
이 두 개념은 함께 이해해야 한다.
1. 상속(Inheritance)
상속은 기존 클래스의 속성과 기능을 물려 받아 새로운 클래스를 만드는 것이다.
class Animal {
void sound() {
System.out.printIn("소리를 낸다");
}
}
class Dog extends Animal{
}
- Animal → 부모 클래스(Super Class)
- Dog → 자식 클래스(Sub Class)
- extends → 상속 키워드
Dog는 Animal의 메서드를 그대로 사용할 수 있다.
1) 상속의 목적
- 코드 재사용
- 계층 구조 표현
- 유지보수 용이
2. 메서드 오버라이딩(Overriding)
자식 클래스에서 부모의 메서드를 재정의하는 것
class Dog extends Animal {
@Override
void sound() {
System.out.printIn("멍멍");
}
}
조건
- 메서드 이름 동일
- 매개 변수 동일
- 반환 타입 동일
3. 다형성(Polymorphism)
다형성은 하나의 타입으로 여러 객체를 다룰 수 있는 성질이다.
Animal a = new Dog();
- 참조 타입 → Animal
- 실제 객체 → Dog
이게 다형성의 핵심이다.
4. 업캐스팅(Upcasting)
자식 객체를 부모 타입으로 참조하는 것
Animal a = new Dog();
자동으로 이루어진다.
특징
- 부모 타입의 메서드만 접근 가능
- 실제 실행은 자식 메서드
5. 동적 바인딩(Dynamic Binding)
메서드 호출은 참조 타입이 아니라 실제 객체 기준으로 결정된다.
Animal a = new Dog();
a.sound(); //"멍멍" 출력
컴파일 시점 → Animal 타입
실행 시점 → Dog 객체
이것이 다형성의 핵심 원리다.
6. 다운캐스팅(Downcasting)
부모 타입을 다시 자식 타입으로 변환하는 것
Dog a = (Dog) a;
명시적 형변환이 필요하다.
실제 객체가 해당 타입이 아닐 경우 예외가 발생한다.
if (a instanceof Dog) {
Dog d = (Dog) a;
}
7. 상속과 다형성의 관계
상속이 있어야 다형성이 가능하다.
- 상속 → 타입 계층 형성
- 다형성 → 부모 타입으로 자식 객체를 다룸
- 오버라이딩 → 동적 바인딩 발생
8. 왜 중요한가?
실무에서 가장 많이 쓰이는 구조
List<Animal> animals = new ArrayList<>();
부모 타입으로 컬렉션을 만들고, 여러 자식 객체를 넣는다.
이게 객체 지향 설계의 기본 패턴이다.