[java] 자바 추상 클래스와 인터페이스를 통해 다형성을 구현하는 방법

개요

자바에서 다형성을 구현하는 방법 중 추상 클래스와 인터페이스를 사용하는 방법에 대해 알아보겠습니다. 추상 클래스와 인터페이스는 객체 지향 프로그래밍에서 중요한 개념으로, 다형성을 활용하여 유연하고 확장 가능한 코드를 작성할 수 있도록 도와줍니다.

추상 클래스 (Abstract Class)

추상 클래스는 일부 메서드가 구현되지 않은 추상 메서드를 포함하고 있는 클래스입니다. 이 추상 메서드는 상속받은 클래스에서 반드시 구현해야 합니다. 추상 클래스는 다른 클래스가 상속 받을 수 있는 기본적인 구조를 제공하며, 객체의 특성을 정의하기 위한 추상적인 개념을 표현할 수 있습니다.

추상 클래스를 정의하기 위해서는 abstract 키워드를 클래스 선언 앞에 붙여야 합니다. 추상 메서드는 반환 타입, 메서드 이름, 매개변수 등을 포함하지만, 메서드 몸체는 구현되지 않습니다.

다음은 추상 클래스를 정의한 예시입니다.

abstract class Animal {
    // 추상 메서드
    public abstract void makeSound();

    // 일반 메서드
    public void sleep() {
        System.out.println("동물이 잠을 잡니다.");
    }
}

위의 코드에서 makeSound() 메서드는 추상 메서드로, 하위 클래스에서 반드시 구현해야 합니다. sleep() 메서드는 일반 메서드로, 상속받은 하위 클래스에서도 사용할 수 있습니다.

추상 클래스를 상속받는 하위 클래스는 추상 메서드를 반드시 구현해야 하며, 추상 클래스를 인스턴스화할 수 없습니다.

인터페이스 (Interface)

인터페이스는 추상 클래스와 유사한 개념이지만, 추상 메서드와 상수만을 가질 수 있습니다. 인터페이스는 클래스의 일종인 것처럼 동작하지만, 구현되지 않은 메서드의 목록만을 제공합니다.

인터페이스를 정의하기 위해서는 interface 키워드를 사용해야 합니다. 메서드의 선언만을 포함하며, 메서드 몸체는 구현되지 않습니다. 상수를 선언할 수도 있습니다. 인터페이스는 다른 클래스에 의해 구현될 수 있으며, 여러 인터페이스를 동시에 구현할 수도 있습니다.

다음은 인터페이스를 정의한 예시입니다.

interface Vehicle {
    // 추상 메서드
    void start();

    void stop();

    // 상수
    int NUMBER_OF_WHEELS = 4;
}

위의 코드에서 start()stop() 메서드는 추상 메서드로, 구현될 때마다 클래스에 맞게 재정의해야 합니다. NUMBER_OF_WHEELSfinalstatic 한정자가 자동으로 적용되는 상수입니다.

인터페이스를 구현하는 클래스는 인터페이스의 모든 추상 메서드를 구현해야 합니다.

다형성 (Polymorphism)

다형성은 같은 타입이지만 서로 다른 동작을 하는 객체를 사용하는 개념입니다. 자바는 추상 클래스와 인터페이스를 통해 다형성을 구현할 수 있습니다. 추상 클래스와 인터페이스를 사용하면 코드의 재사용성과 유연성을 높일 수 있으며, 다양한 객체를 통한 관리와 확장이 용이해집니다.

다음은 추상 클래스와 인터페이스를 이용해 다형성을 구현한 예시입니다.

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("야옹~");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

class Car implements Vehicle {
    @Override
    public void start() {
        System.out.println("시동을 걸었습니다.");
    }

    @Override
    public void stop() {
        System.out.println("차를 정지합니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal cat = new Cat();
        Animal dog = new Dog();
        Vehicle car = new Car();

        cat.makeSound();
        dog.makeSound();
        car.start();
        car.stop();
    }
}

위의 코드에서 CatDog 클래스는 Animal 추상 클래스를 상속받아 makeSound() 메서드를 구현하고 있습니다. Car 클래스는 Vehicle 인터페이스를 구현하여 start()stop() 메서드를 구현하고 있습니다. Main 클래스에서 생성한 객체는 각각 Animal 혹은 Vehicle 타입으로 선언되었지만, 실제로는 각각 Cat, Dog, Car 객체를 참조하고 있습니다. 따라서 makeSound()start(), stop() 메서드가 각각 다른 동작을 수행하게 됩니다.

결론

자바에서 추상 클래스와 인터페이스를 활용하여 다형성을 구현할 수 있습니다. 추상 클래스는 상속과 메서드 구현을 통해 다른 클래스에게 공통된 구조를 제공하며, 인터페이스는 메서드 목록을 정의하여 클래스의 동작을 표준화할 수 있습니다. 다형성은 코드의 재사용성과 유연성을 높여주며, 객체 지향 프로그래밍의 핵심 개념 중 하나입니다.

참고 자료