[Android] Abstract Class vs Interface: 무엇을 선택해야 할까?
객체 지향 프로그래밍(Object-Oriented Programming)에서 abstract class와 interface는 모두 코드를 더 간결하고 재사용 가능하게 만드는 도구입니다. 하지만 이 두 가지는 목적과 사용 방법에서 중요한 차이가 있습니다. 이 글에서는 초보자도 쉽게 이해할 수 있도록 abstract class와 interface의 개념과 차이점을 풀어서 설명해 보겠습니다.
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:
- 여러 클래스가 공통적으로 따라야 할 규칙만 정의해야 할 때.
- 예: "날 수 있는 기능"과 "수영할 수 있는 기능"이라는 규칙을 정의하고, 이를 여러 클래스가 동시에 따를 수 있게 함.
결론
추상 클래스와 인터페이스는 프로그래머가 코드를 더 체계적으로 작성하도록 돕는 도구입니다.
- 공통 속성과 동작을 공유하고 싶다면 → 추상 클래스 사용.
- 공통 규칙만 강제하고 싶다면 → 인터페이스 사용.
필요에 따라 두 가지를 조합해서 사용하면, 더욱 유연하고 효율적인 코드를 작성할 수 있습니다.