[JAVA] 09 인터페이스 / 추상 클래스 / 오버라이딩 / 오버로딩
이번 글에서는 객체지향의 핵심 개념 중 자주 함께 등장하는 인터페이스, 추상 클래스, 그리고 오버라이딩과 오버로딩을 정리한다. 개념 간의 차이를 명확히 구분하는 것이 중요하다.
1. 추상 클래스(Abstract Class)
추상 클래스는 하나 이상의 추상 메서드를 가질 수 있는 클래스다. 객체를 직접 생성할 수 없으며, 상속을 통해서만 사용된다.
abstract class Animal {
abstract void sound();
void sleep() {
System.out.println("잔다");
}
}
- abstract 키워드 사용
- 추상 메서드는 구현부가 없다
- 일반 메서드도 가질 수 있다
- 필드(상태)를 가질 수 있다
추상 클래스 상속
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
Animal a = new Dog();
a.sound();
a.sleep();
OUTPUT
멍멍
잔다
추상 메서드는 자식 클래스에서 반드시 구현해야 한다.
2. 인터페이스(Interface)
인터페이스는 구현 없이 메서드의 규약만 정의한다.
interface Flyable {
void fly();
}
- implements 키워드 사용
- 다중 구현 가능
- 모든 메서드는 기본적으로 public abstract
- 필드는 자동으로 public static final (상수)
인터페이스 구현
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("난다");
}
}
Flyable f = new Bird();
f.fly();
OUTPUT
난다
인터페이스의 메서드는 반드시 public으로 구현해야 한다.
3. 인터페이스의 확장 기능 (Java 8+)
Java 8부터 인터페이스는 default 메서드와 static 메서드를 가질 수 있다.
interface Test {
default void hello() {
System.out.println("기본 구현");
}
static void staticMethod() {
System.out.println("static 메서드");
}
}
default 메서드는 구현을 포함할 수 있다.
4. 추상 클래스 vs 인터페이스 차이
| 구분 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 키워드 | extends | implements |
| 다중 상속 | 불가능 | 가능 |
| 필드 | 가능 | 상수만 가능 |
| 일반 메서드 | 가능 | default로 가능 |
| 설계 목적 | 공통 기능 재사용 | 행위 규약 정의 |
5. 오버라이딩(Overriding)
오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것이다.
class Animal {
void sound() {
System.out.println("소리");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
Animal animal = new Dog();
animal.sound();
OUTPUT
멍멍
- 메서드 이름 동일
- 매개변수 동일
- 반환 타입 동일
- 접근 제어자는 더 좁아질 수 없다
- final 메서드는 오버라이딩 불가
실행 시점에 실제 객체의 메서드가 호출된다. 이를 동적 바인딩이라 한다.
6. 오버로딩(Overloading)
오버로딩은 같은 이름의 메서드를 매개변수 구성을 다르게 하여 정의하는 것이다.
class Calculator {
int add(int a, int b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
- 메서드 이름 동일
- 매개변수 개수 또는 타입 다름
- 반환 타입만 다른 것은 불가
- 컴파일 시점에 결정됨
7. 오버라이딩 vs 오버로딩
| 구분 | 오버라이딩 | 오버로딩 |
|---|---|---|
| 관계 | 상속 관계 | 같은 클래스 |
| 매개변수 | 같음 | 다름 |
| 실행 시점 | 런타임 | 컴파일 타임 |
| 바인딩 | 동적 바인딩 | 정적 바인딩 |
8. 정리
- 추상 클래스 → 공통 기능과 상태를 제공
- 인터페이스 → 행위 규약 정의
- 오버라이딩 → 상속 관계에서 동작 재정의
- 오버로딩 → 같은 기능을 다양한 입력 형태로 제공
- 다형성은 오버라이딩과 함께 동작한다
'Computer Science > Java' 카테고리의 다른 글
| [JAVA] 예외가 터지면 코드 흐름은 어떻게 될까 (0) | 2026.02.13 |
|---|---|
| [JAVA] 12 IO / 파일 처리 / 문자열 처리 (0) | 2026.02.13 |
| [JAVA] 11 예외 처리(Exception) (0) | 2026.02.13 |
| [JAVA] 02 연산자와 형 변환 (0) | 2026.02.01 |
| [JAVA] 01 변수와 자료형 (0) | 2026.02.01 |