[java] 추상 클래스와 인터페이스를 사용하여 객체를 어떻게 다룰 수 있는지

자바에서 추상 클래스와 인터페이스는 객체 지향 프로그래밍의 핵심 개념입니다. 이들을 사용하여 다형성을 구현하고 객체를 유연하게 다룰 수 있습니다. 이번 글에서는 추상 클래스와 인터페이스를 사용하여 객체를 다루는 방법에 대해 알아보겠습니다.

추상 클래스(Abstract Class)

추상 클래스는 미완성된 클래스로, 구체적인 메서드 구현을 가지지 않고 추상 메서드를 포함합니다. 추상 클래스는 다른 클래스에서 상속받아 사용될 목적으로 만들어집니다. 다음은 추상 클래스의 예시 코드입니다.

public abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

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

    public void sleep() {
        System.out.println("Zzz...");
    }
}

위 코드에서 Animal 클래스는 makeSound() 메서드가 추상 메서드로 선언되어 있습니다. 이 클래스를 상속받는 서브클래스에서 추상 메서드를 구현해야 합니다. 추상 클래스는 객체를 직접 생성할 수 없으며, 서브클래스를 통해 사용됩니다.

public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

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

Dog 클래스는 Animal 클래스를 상속받고, makeSound() 메서드를 구현합니다. 이제 Animal의 추상 메서드를 구현하지 않은 서브클래스를 만들 수 없습니다.

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog("멍멍이");
        dog.makeSound();
        dog.sleep();
    }
}

Main 클래스에서 Animal 타입의 변수 dog를 생성하여 Dog 인스턴스를 할당하고, makeSound()sleep() 메서드를 호출합니다. 결과적으로 “멍멍!”과 “Zzz…“가 출력됩니다.

인터페이스(Interface)

인터페이스는 일종의 계약(Contract)으로, 클래스가 가져야 할 기능을 정의합니다. 클래스가 인터페이스를 구현(Implement)하면 인터페이스에서 정의한 메서드를 반드시 구현해야 합니다. 인터페이스는 클래스의 다중 상속을 가능하게 해주는 역할도 합니다. 다음은 인터페이스의 예시 코드입니다.

public interface Printable {
    void print();
}

위 코드에서 Printable 인터페이스는 print() 메서드를 정의합니다. 클래스가 이 인터페이스를 구현하면 print() 메서드를 반드시 구현해야 합니다.

public class Document implements Printable {
    @Override
    public void print() {
        System.out.println("문서를 인쇄합니다.");
    }
}

Document 클래스는 Printable 인터페이스를 구현하여 print() 메서드를 구현합니다.

public class Main {
    public static void main(String[] args) {
        Printable document = new Document();
        document.print();
    }
}

Main 클래스에서 Printable 타입의 변수 document를 생성하여 Document 인스턴스를 할당하고, print() 메서드를 호출합니다. 결과적으로 “문서를 인쇄합니다.”가 출력됩니다.

결론

추상 클래스와 인터페이스는 자바에서 객체를 다루는 데 필수적인 개념입니다. 추상 클래스는 추상 메서드를 포함하여 서브클래스에서 구현되어야 하는 기능을 정의하는데 사용되고, 인터페이스는 클래스가 가져야 할 기능을 정의하여 다중 상속과 결합할 수 있도록 합니다. 이를 통해 객체를 유연하고 확장 가능한 방식으로 다룰 수 있습니다.

참고 자료: