자바 상속 · 다형성
1) 상속(Inheritance)
정의 & 특징
- 부모 클래스의 필드/메소드를 자식이 물려받아 사용(생성자는 상속 X).
- 단일 상속만 지원.
- 부모의 타입도 상속되어 다형성의 토대가 됨.
기본 문법
class Academy extends Company { }
super / super()
class Computer extends Device {
Computer(String cpu) {
super();
this.cpu = cpu;
}
@Override
public String info() {
return super.info() + ", cpu=" + cpu;
}
}
오버라이딩(Overriding) 규칙
- 메소드명/리턴타입/매개변수(타입·개수·순서) 모두 동일
private·final 메소드는 불가
- 접근 제어자는 같거나 더 넓게
- 예외는 같거나 더 구체적으로
오버라이딩 vs 오버로딩
| 구분 | 오버라이딩 | 오버로딩 |
|---|
| 위치 | 상속 관계 | 동일 클래스 |
| 시그니처 | 동일 | 매개변수 다름 |
| 목적 | 동작 재정의 | 편의 제공 |
2) 다형성(Polymorphism)
정의
- 하나의 인스턴스가 여러 타입(상위 타입 포함)을 가질 수 있음 → 하나의 참조로 다양한 객체를 다룸.
장점 요약
- 컬렉션/배열을 상위 타입으로 통일 관리
- **메시지(메소드)**를 줄이고 객체별 다른 동작(오버라이딩) 제공
- 확장 용이, 결합도↓
동적 바인딩
컴파일 시에는 상위 타입 메소드에 연결, 런타임에 실제 인스턴스의 메소드로 바인딩.
class Animal { void cry(){ System.out.println("동물"); } }
class Tiger extends Animal { @Override void cry(){ System.out.println("어흥"); } }
Animal a = new Tiger();
a.cry();
업캐스팅/다운캐스팅 & instanceof
Animal a = new Tiger();
if (a instanceof Tiger) {
((Tiger) a).bite();
}
3) 추상 클래스(Abstract Class)
정의
- **추상 메소드(몸체 없음)**를 0개 이상 포함하는 불완전한 클래스.
- 직접 인스턴스화 불가 → 하위 클래스로 구현하여 사용.
abstract class Shape {
abstract double area();
String name(){ return "도형"; }
}
사용하는 이유
- 상위 타입을 통해 다형성 기반 제공
- 오버라이딩 강제로 일관된 인터페이스 보장
4) 인터페이스(Interface)
정의 & 문법
- **상수(public static final)**와 **추상 메소드(public abstract)**만 가짐.
implements로 구현(다중 구현 가능).
interface Movable {
double PI = 3.14;
void move();
}
class Person implements Movable, java.io.Serializable {
@Override public void move(){ System.out.println("걷기"); }
}
사용하는 이유
- 공통 기능 강제(계약)
- 단일 상속 한계 보완(다중 인터페이스 구현)
5) 추상 클래스 vs 인터페이스
| 구분 | 추상 클래스 | 인터페이스 |
|---|
| 키워드 | extends | implements |
| 상속/구현 수 | 단일 상속 | 다중 구현 가능 |
| 멤버 | 필드/생성자/일반메소드/추상메소드 | 상수, 추상메소드 |
| 추상 메소드 수 | 0개 이상 | (기본적으로) 전부 추상 |
| 인스턴스 생성 | 직접 불가 | 직접 불가 |
| 상위 타입 활용 | 가능 | 가능 |
6) 요약
- IS-A 관계가 자연스러운가? → 상속 사용
- 메소드 계약 강제/다중 타입 필요? → 인터페이스
- 동작 재정의는 오버라이딩, 편의 생성은 오버로딩
super로 부모 초기화/동작 확장, instanceof로 안전 캐스팅