[JAVA] 09 인터페이스 / 추상 클래스 / 오버라이딩 / 오버로딩

[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. 정리

  • 추상 클래스 → 공통 기능과 상태를 제공
  • 인터페이스 → 행위 규약 정의
  • 오버라이딩 → 상속 관계에서 동작 재정의
  • 오버로딩 → 같은 기능을 다양한 입력 형태로 제공
  • 다형성은 오버라이딩과 함께 동작한다