추상 클래스와 인터페이스는 객체지향 프로그래밍에서 중요한 개념으로, 클래스의 다형성을 지원하고 코드의 재사용성을 높이는데 큰 역할을 합니다. 이 두 가지의 차이점을 명확히 이해하는 것은 효율적인 설계와 구현을 위해 필수적이라고 생각합니다!
이번글에서는 두 클래스의 개념과 차이점에 대해 알아보도록 하겠습니다.🤓
추상 클래스(abstract class)
추상클래스는 공통된 속성이나 동작을 정의하는 데 사용되는 클래스입니다. (다른 클래스들이 상속받아 사용할 수 있는 기본 틀 🧐)
인스턴스를 직접 생성할 수 있으며, 상속을 통해 하위 클래스에서 구현되어야 하는 메서드를 포함할 수 있습니다.
- 인스턴스 생성 불가
추상 클래스 자체로는 객체를 생성할 수 없습니다. - 추상 메서드
하나 이상의 추상 메서드를 포함할 수 있으며, 이를 상속받는 하위 클래스에서 구현해야 합니다. - 일반 메서드와 속성 포함 가능
추상 클래스는 추상 메서드뿐만 아니라 구현된 메서드와 속성도 가질 수 있습니다. - 단일 상속
한 클래스는 하나의 추상 클래스만 상속받을 수 있습니다.
abstract class Animal {
// 추상 메서드: 하위 클래스에서 구현해야 함
abstract void makeSound();
// 일반 메서드
void breathe() {
System.out.println("Breathing...");
}
}
class Dog extends Animal {
// 추상 메서드 구현
void makeSound() {
System.out.println("Bark");
}
}
// 객체 생성 불가 예제
// Animal animal = new Animal(); // 컴파일 에러: 추상 클래스의 인스턴스를 생성할 수 없습니다.
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // 출력: Bark
dog.breathe(); // 출력: Breathing...
}
}
인터페이스(Interface)
인터페이스는 클래스가 구현해야 하는 메서드의 목록을 정의합니다.
모든 메서드는 기본적으로 추상 메서드이며, 다중 상속을 지원합니다. (인터페이스 자체는 메서드의 구현을 포함하지 않습니다!)
- 추상 메서드
인터페이스에 선언된 모든 메서드는 기본적으로 추상 메서드입니다. - 다중 상속 가능
한 클래스가 여러 인터페이스를 구현할 수 있습니다. - 디폴트 메서드와 정적 메서드
Java8부터 인터페이스는 디폴트 메서드(구현을 가진 메서드)와 정적 메서드를 포함할 수 있습니다. - 상수만 포함 가능
인터페이스 내의 모든 필드는 기본적으로 'public static final'입니다.
interface Animal {
// 추상 메서드
void makeSound();
}
class Dog implements Animal {
// 인터페이스 메서드 구현
public void makeSound() {
System.out.println("Bark");
}
}
// 상수만 포함 예제
interface Constants {
// 인스턴스 변수 포함 불가 예제
// int age; // 컴파일 에러: 인터페이스의 변수는 상수여야 합니다.
int MAX_AGE = 100; // 인터페이스의 변수는 상수여야 함
}
// 다중 상속 예제
interface Mammal {
void feed();
}
class Cat implements Animal, Mammal {
public void makeSound() {
System.out.println("Meow");
}
public void feed() {
System.out.println("Feeding kittens...");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // 출력: Bark
Cat cat = new Cat();
cat.makeSound(); // 출력: Meow
cat.feed(); // 출력: Feeding kittens...
}
}
추상클래스와 인터페이스 차이점
| 특성 | 추상 클래스 | 인터페이스 |
| 인스턴스화 | 불가능 | 불가능 |
| 메서드 구현 | 구현된 메서드와 추상 메서드 모두 포함 가능 | 기본적으로 추상 메서드만 포함 (디폴트 메서드와 정적 메서드는 예외) |
| 다중 상속 | 불가능 (단일 상속만 가능) | 가능 |
| 필드 | 인스턴스 변수, 클래스 변수 포함 가능 | 상수만 포함 가능 (public static final) |
| 사용 목적 | 공통된 속성과 동작을 정의하고 재사용성 높이기 | 특정 기능을 구현하도록 강제하기 |
언제 무엇을 사용할까?
추상 클래스 사용 사례
- 공통된 기능 공유
여러 클래스에서 공통된 속성과 메서드를 공유할 때 사용합니다. - 부분 구현 제공
기본적인 기능을 제공하면서 하위 클래스에서 세부 구현을 강제하고 싶을 때 유용합니다.
인터페이스 사용 사례
- 다중 상속 필요
Java는 클래스의 다중 상속을 지원하지 않지만, 인터페이스를 통해 여러 기능을 구현할 수 있습니다. - 특정 행동을 강제
클래스가 특정 메서드를 반드시 구현하게 하고 싶을 때 사용합니다.
💡추상 클래스와 인터페이스는 객체 지향 프로그래밍에서 매우 중요한 개념입니다. 추상 클래스는 공통된 기능을 공유하고 부분적인 구현을 제공할 때 유용하며, 인터페이스는 다중 상속이 필요하거나 특정 행동을 강제할 때 유용합니다. 이 두 개념을 잘 이해하고 적절하게 활용하면 더 효율적이고 유지보수하기 쉬운 코드를 작성할 수 있을 것이라고 생각합니다.
'Backend > Java' 카테고리의 다른 글
| [Java] ConcurrentHashMap 멀티스레드 환경에서 안전한 해시맵 (0) | 2024.07.28 |
|---|---|
| [Java] computeIfAbsent 효율적인 데이터 캐싱과 값 처리 (0) | 2024.07.27 |
| [Java] of와 from 메서드의 차이 (0) | 2024.07.04 |
| [Java] Equals와 == 의 차이 (0) | 2024.05.25 |
| [Java] Record란? (0) | 2024.04.13 |