어질어질 개발노트/Android

[Android] Abstract Class vs Interface: 무엇을 선택해야 할까?

tia.mom 2025. 1. 14. 22:57
반응형

객체 지향 프로그래밍(Object-Oriented Programming)에서 abstract classinterface는 모두 코드를 더 간결하고 재사용 가능하게 만드는 도구입니다. 하지만 이 두 가지는 목적과 사용 방법에서 중요한 차이가 있습니다. 이 글에서는 초보자도 쉽게 이해할 수 있도록 abstract classinterface의 개념과 차이점을 풀어서 설명해 보겠습니다.


1. Abstract Class란?

abstract class는 "설계도" 같은 역할을 하는 클래스입니다. 이 설계도는 일부 기능은 완성되어 있고, 일부는 완성되지 않은 상태로 남아있어 자식 클래스가 이어서 구현하도록 만듭니다.

특징:

  • 부분 구현 가능: 설계도에 일부는 이미 만들어져 있습니다.
  • 상속: 부모 클래스를 한 번에 하나만 상속받을 수 있습니다.
  • 생성자: 생성자를 포함할 수 있어 데이터를 초기화할 수 있습니다.

쉽게 말해: "공통적인 틀을 제공하면서도, 구체적인 세부 사항은 각 자식 클래스가 알아서 채우도록 강제하고 싶을 때 사용합니다."

예제 코드:

abstract class Animal {
    String name;

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

    abstract void sound();  // "어떤 소리를 내는지"는 자식 클래스가 정해야 함

    void eat() {
        System.out.println(name + " is eating.");
    }
}

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

    @Override
    void sound() {
        System.out.println("Bark");
    }
}

위 코드는 "동물"이라는 큰 틀을 만들고, "강아지"는 어떤 소리를 내는지를 직접 정의한 예제입니다.


2. Interface란?

interface는 "규칙서" 같은 역할을 합니다. 인터페이스는 클래스에 "이런 기능을 꼭 만들어라"라고 명령만 내리고, 구체적인 구현은 하지 않습니다.

특징:

  • 구현 강제: 인터페이스에 있는 모든 기능은 꼭 만들어야 합니다.
  • 다중 구현 가능: 여러 규칙서를 한 번에 따를 수 있습니다.
  • 상태 유지 불가: 데이터를 저장하거나 초기화하는 건 불가능합니다.

쉽게 말해: "다양한 클래스가 공통적으로 따라야 할 규칙을 정해주는 데 사용합니다."

예제 코드:

interface Animal {
    void sound();  // 어떤 소리를 내는지 정의해야 함
    void eat();    // 어떻게 먹는지도 정의해야 함
}

class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("Meow");
    }

    @Override
    public void eat() {
        System.out.println("Cat is eating.");
    }
}

위 코드는 "동물"이라는 규칙서를 만들어서, "고양이"가 그 규칙을 따르도록 만든 예제입니다.


3. Abstract Class와 Interface의 주요 차이점

특징 Abstract Class Interface
목적 공통적인 속성과 행동을 정의 공통적인 규칙을 정의
메서드 구현 여부 이미 만들어진 메서드를 포함 가능 모든 메서드는 기본적으로 비워져 있음 (Java 8 이후 기본 메서드 가능)
다중 상속 여부 단일 상속만 가능 여러 인터페이스를 한 번에 구현 가능
필드 변수와 상수 모두 가능 상수만 가능
생성자 생성자 포함 가능 생성자 불가능

 


4. 언제 사용해야 할까?

  • Abstract Class:
    • 공통된 속성(데이터)과 기본 동작(메서드)을 여러 클래스에서 공유해야 할 때.
    • 예: "동물"이라는 틀을 만들고, 강아지와 고양이가 이를 상속받아 공통 동작을 재사용.
  • Interface:
    • 여러 클래스가 공통적으로 따라야 할 규칙만 정의해야 할 때.
    • 예: "날 수 있는 기능"과 "수영할 수 있는 기능"이라는 규칙을 정의하고, 이를 여러 클래스가 동시에 따를 수 있게 함.

결론

추상 클래스와 인터페이스는 프로그래머가 코드를 더 체계적으로 작성하도록 돕는 도구입니다.

  • 공통 속성과 동작을 공유하고 싶다면 → 추상 클래스 사용.
  • 공통 규칙만 강제하고 싶다면 → 인터페이스 사용.

필요에 따라 두 가지를 조합해서 사용하면, 더욱 유연하고 효율적인 코드를 작성할 수 있습니다.

반응형