개발 문서/Java

인터페이스와 추상 클래스의 활용

copg 2023. 11. 11. 02:50
728x90
반응형

인터페이스(Interface)와 추상 클래스(Abstract Class)는 자바에서 다형성을 증진시키고, 코드의 재사용성을 높이는 데 기여하는 중요한 개념입니다. 각각의 특징과 활용 방법을 알아보겠습니다.

인터페이스 (Interface):

인터페이스는 메소드의 선언만을 갖고 있고, 해당 메소드의 실제 구현은 없는 추상화된 형태의 클래스입니다. 다른 클래스에서 이 인터페이스를 구현하면, 해당 클래스는 인터페이스에서 정의된 메소드들을 모두 구현해야 합니다.

// 인터페이스 정의
interface Shape {
    double calculateArea();  // 메소드 선언만, 구현은 없음
}

// 인터페이스를 구현한 클래스
class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}

// 다른 인터페이스 구현 클래스
class Rectangle implements Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double calculateArea() {
        return width * height;
    }
}

인터페이스의 활용은 다중 상속을 지원하며, 클래스가 여러 인터페이스를 동시에 구현할 수 있도록 합니다. 또한, 서로 다른 클래스들이 동일한 인터페이스를 구현함으로써, 같은 형태로 다룰 수 있는 다형성을 구현할 수 있습니다.

추상 클래스 (Abstract Class):

추상 클래스는 일부 메소드를 구현하고, 나머지 메소드는 서브 클래스에서 구현하도록 강제하는 클래스입니다. 추상 클래스는 일반 메소드뿐만 아니라 추상 메소드(abstract method)를 가질 수 있습니다.

// 추상 클래스 정의
abstract class Animal {
    // 일반 메소드
    void eat() {
        System.out.println("Animal is eating");
    }

    // 추상 메소드
    abstract void makeSound();
}

// 추상 클래스를 상속받은 구현 클래스
class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Dog barks");
    }
}

// 다른 추상 클래스를 상속받은 구현 클래스
class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Cat meows");
    }
}

추상 클래스는 상속 관계에서 공통된 구현을 가지는 클래스들에 대한 추상화를 제공합니다. 또한, 추상 메소드를 통해 서브 클래스에서 반드시 구현해야 하는 메소드를 명시함으로써, 강제성을 부여합니다.

두 개념 모두 코드의 재사용성을 증가시키고 다형성을 구현하는 데 기여합니다. 일반적으로 인터페이스는 더 유연한 형태의 다중 상속을 지원하며, 추상 클래스는 공통된 구현을 가진 클래스들을 위한 추상화를 제공합니다. 선택은 문제의 상황과 설계 목표에 따라 이루어져야 합니다.