Java

추상 클래스 / 인터페이스

99duuk 2024. 12. 20. 12:11

추상 클래스는 공통된 메서드와 필드를

'상속받는 하위 클래스'에서 재사용하거나 활용할 수 있도록 설계된다.

 

구현된 메서드 추상 메서드(구현되지 않고 하위 클래스에서 구현해야만 하는 메서드)를 모두 가질 수 있고,

주로 상향식 설계에서 사용되며,

관련 클래스 간 공통된 기능을 모아 캡슐화하고 코드 재사용성을 높이는데 유용하람쥐


인터페이스는 클래스가 구현해야 할 메서드를 미리 선언만 하고,

실제 구현을 구현하는 클래스에 위임한다.

 

다중 구현이 가능하고, 클래스가 특정 행동(메서드)을 반드시 구현하도록 강제하고 싶을 때 !! 밀이

하향식 설계에 적합하다고 볼 수 있다

 

즉, 추상 클래스는 "공통된 기능을 캡슐화"하는 데 중점을 두고, 인터페이스는 "행동 규약을 강제"하는 데 초점이 맞춰져 있다람쥐


추상 클래스 

추상 클래스는 공통된 기능을 캡슐화하고, 하위 클래스가 이를 재사용하거나 확장하도록 설계된다

// 추상 클래스
abstract class Animal {
    // 공통된 구현 메서드
    void eat() {
        System.out.println("This animal eats food.");
    }

    // 추상 메서드 (하위 클래스가 반드시 구현)
    abstract void sound();
}

// 하위 클래스 1
class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Woof!");
    }
}

// 하위 클래스 2
class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("Meow!");
    }
}

// 테스트 클래스
public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();

        dog.eat();    // 공통 메서드 사용
        dog.sound();  // 하위 클래스에서 구현한 메서드 호출

        cat.eat();    // 공통 메서드 사용
        cat.sound();  // 하위 클래스에서 구현한 메서드 호출
    }
}

 

  • eat()는 모든 동물이 공통으로 가지는 기능이므로 추상 클래스에서 구현
  • sound()는 동물마다 다르게 구현되므로 추상 메서드로 정의하고, 각 하위 클래스에서 구현하도록 강제

인터페이스

인터페이스는 클래스가 특정 행동(메서드)을 반드시 구현하도록 강제

// 인터페이스
interface Vehicle {
    // 구현해야 할 메서드 선언
    void start();
    void stop();
}

// 구현 클래스 1
class Car implements Vehicle {
    @Override
    public void start() {
        System.out.println("Car is starting.");
    }

    @Override
    public void stop() {
        System.out.println("Car is stopping.");
    }
}

// 구현 클래스 2
class Bike implements Vehicle {
    @Override
    public void start() {
        System.out.println("Bike is starting.");
    }

    @Override
    public void stop() {
        System.out.println("Bike is stopping.");
    }
}

// 테스트 클래스
public class Main {
    public static void main(String[] args) {
        Vehicle car = new Car();
        Vehicle bike = new Bike();

        car.start();
        car.stop();

        bike.start();
        bike.stop();
    }
}

 

  • Vehicle 인터페이스는 start()와 stop() 메서드를 선언만 하고, 실제 구현은 각 클래스가 필요에 맞게 구현하도록 강제
  • Car와 Bike는 같은 Vehicle의 행동 규약을 따르지만, 동작 방식은 다를 수 있음

 

 

 

  • 공통 기능(메서드, 필드)이 있다면 → 추상 클래스 사용.
    예: Animal 클래스의 eat() 메서드.
  • 다양한 역할(행동 규약)을 정의하고 강제하고 싶다면 → 인터페이스 사용.
    예: Vehicle 인터페이스의 start()와 stop() 메서드.