하나의 인스턴스가 여러가지 타입을 가질 수 있는 것을 의미한다.
하나의 타입으로 여러 타입의 인스턴스를 처리할 수 있기도 하고, 하나의 메소드 호출로 객체별로 각기 다른 방법으로 동작하게 할 수 도 있다
객체지향프로그래밍의 3대 특징(캡슐화, 상속, 추상화, 다형성 = 캡상추다) 중 하나
: 컴파일 당시에는 해당 타입의 메소드와 연결되어 있다가 런타임 시 실제 해당 인스턴스가 메소드(오버라이딩한 메소드)로 바인딩이 바뀌어 동작하는 것을 의미
성립 조건: 상속관계를 가지는 부모자식 클래스에 오버라이딩된 메소드를 호출해야한다.

시점 결정 기준 결과 컴파일 시점 a1,a2의 타입은Animal이므로sound()메서드 호출이 가능하다고 판단 (형식적 검사만 함)OK 실행 시점 a1은Dog객체,a2는Cat객체이므로, 각 객체의 sound() 실행실제 동작 결정됨
업캐스팅 : 상위타입으로 형변환 (묵시적으로 일어남)
다운캐스팅 : 하위타입으로 형변환(명시적으로 작성해야함)
클래스 형변환의 경우 런타임시 존재하는 타입과 형변환하려는 타입이 일치하지 않는 경우 ClassCastException이 발생함
: instanceof 연산자는 레퍼런스 변수가 실제로 어떤 클래스 타입의 인스턴스인지 확인하여 true or false를 반환한다.
| 구분 | 오버로딩 (Overloading) | 오버라이딩 (Overriding) |
|---|---|---|
| 뜻 | 같은 이름의 메서드를 여러 개 정의 | 부모 클래스의 메서드를 자식이 재정의 |
| 발생 위치 | 같은 클래스 안 또는 상속 관계에서 상위/하위 클래스 모두 가능 | 상속 관계에서만 가능 |
| 조건 | 메서드 이름 같고, 매개변수 다름 (개수·타입·순서) | 메서드 이름, 매개변수, 리턴타입 모두 같아야 함 |
| 접근 제한자 | 상관없음 | 부모보다 좁게는 불가능 |
| static 여부 | 가능 (static 메서드도 오버로딩 가능) | static 메서드는 오버라이딩 불가능 (가려짐, shadowing) |
| 목적 | 편의성 — 같은 기능을 다양한 형태로 제공 | 다형성 구현 — 부모 타입으로 자식 객체 제어 |
🔸 오버로딩 = 같은 이름, 다른 매개변수 → "한 클래스 안에서 다양하게 쓴다"
ex) add() 이름은 같지만, 매개변수 타입/개수가 다르므로 여러 버전을 정의 가능
→ 호출 시 넘기는 인자에 따라 자동으로 알맞은 메서드가 선택됨
🔸 오버라이딩 = 같은 이름, 같은 매개변수 → "상속받은 기능을 새롭게 바꾼다"
ex) 부모의 sound()를 자식이 재정의(override) 했기 때문에,
실제 실행 시점(runtime)에 자식 메서드가 호출돼요. (다형성)
추상 메소드 (메소드의 기능이 없고 메소드의 헤더부만 존재하는 불완전한 메소드)를 0개 이상 포함하는 클래스
스스로 자신의 생성자를 활용한 인스턴스 생성이 불가능.
=> 불완전한 클래스
추상클래스를 상속받는 자식 클래스는 오버라이딩을 할수밖에 없음 => 오버라이딩에 대한 강제성 부여
==> 일관된 인터페이스(동일 기능)를 제공
: 추상 메소드와 상수 필드만 가질 수 있는 클래스의 변형체
implements라는 키워드를 사용하며 자식 클래스 입장에서 '상속 받았다'고 말하지 않고 '구현한다'라는 표현을 쓴다.
interface TestInter { // 모든 필드는 public static final만 가능하다. public static final PI1 = 3.1415; // public static final을 생략해도 자동으로 작성된다.(생략 가능) PI2 = 3.14; // 기본적으로 메소드는 public abstract여야 한다. public abstract void method1(); // public abstract를 생략해도 자동으로 작성된다.(생략 가능) void method2(); }
인터페이스는 공유를 목적으로 하는 상수(public static final 필드)를 기반으로 모든 기능을 공통화(public abstract 메소드)해서 강제성을 부여할 목적으로 만들어짐(공통된 인터페이스)
자바의 단점인 단일상속 극복
모든 클래스는 하나의 부모 클래스 외에도 여러개의 인터페이스를 구현할 수 있음
