**추상 클래스(abstract class)**와 **인터페이스(interface)**는 자바에서 객체 지향 프로그래밍의 중요한 개념으로, 객체 지향 설계를 통해 다양한 클래스들 간의 공통된 행동을 정의하고, 코드의 유연성과 재사용성을 높이는 데 사용됩니다. 둘은 다형성 구현의 중요한 요소이기도 합니다. 각각의 개념에 대해 자세히 설명하겠습니다.
추상 클래스 (Abstract Class)
추상 클래스는 설계의 뼈대와 같은 것이라고 생각하면 됩니다. 이 클래스는 완전하지 않으며, 다른 클래스들이 이 뼈대를 기반으로 실제 기능을 추가하도록 만들어집니다.
- 추상 클래스는:
- 구현되지 않은 메서드(추상 메서드)를 가질 수 있습니다. 이 메서드들은 실제로 무엇을 해야 하는지 정의만 해두고, 실제 구현은 자식 클래스가 합니다.
- 구현된 메서드도 가질 수 있어서, 자식 클래스가 이 메서드를 그대로 사용할 수도 있습니다.
- **상태(변수)**를 가질 수 있어서, 자식 클래스가 공유할 수 있는 데이터를 정의할 수 있습니다.
예제:
// 추상 클래스
abstract class Animal {
// 추상 메서드 (구현 없음)
public abstract void makeSound();
// 구현된 메서드
public void sleep() {
System.out.println("Sleeping...");
}
}
// 자식 클래스
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.makeSound(); // 출력: Bark
myDog.sleep(); // 출력: Sleeping...
}
}
이 예제에서 Animal은 추상 클래스입니다. makeSound는 추상 메서드로, 자식 클래스인 Dog가 구현해야 합니다. sleep 메서드는 구현된 메서드로, 자식 클래스에서 그대로 사용할 수 있습니다.
인터페이스 (Interface)
인터페이스는 계약서와 같은 역할을 합니다. 인터페이스는 클래스가 무엇을 해야 하는지 정의합니다. 그러나 그 방법(구현)은 인터페이스를 구현하는 클래스가 결정합니다.
- 인터페이스는:
- 메서드 선언만을 포함합니다. 실제 구현은 인터페이스를 구현하는 클래스에서 합니다.
- 여러 인터페이스를 구현할 수 있어, 다양한 기능을 클래스에 추가할 수 있습니다.
- 상수만 가질 수 있습니다. 변수는 가질 수 없으며, 항상 public static final로 선언됩니다.
예제:
// 인터페이스
interface Animal {
// 추상 메서드 (구현 없음)
void makeSound();
// 디폴트 메서드 (구현 있음)
default void eat() {
System.out.println("Eating...");
}
}
// 자식 클래스
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.makeSound(); // 출력: Bark
myDog.eat(); // 출력: Eating...
}
}
이 예제에서 Animal은 인터페이스입니다. makeSound 메서드는 인터페이스에서 정의된 대로, 구현하는 클래스에서 제공해야 합니다. eat 메서드는 디폴트 메서드로, Dog 클래스에서 별도로 구현하지 않아도 사용할 수 있습니다.
요약
- 추상 클래스:
- 설계의 뼈대 역할을 하고, 공통된 동작과 상태를 정의합니다.
- 자식 클래스가 이 뼈대를 기반으로 구체적인 동작을 추가합니다.
- 인터페이스:
- 클래스가 무엇을 해야 하는지를 정의하는 계약서와 같습니다.
- 실제 구현은 인터페이스를 구현하는 클래스에서 결정됩니다.
- 여러 인터페이스를 통해 다양한 기능을 클래스에 추가할 수 있습니다.
이렇게 추상 클래스와 인터페이스를 이용하면, 코드의 재사용성을 높이고, 여러 클래스들 간의 일관성을 유지할 수 있습니다.
'JAVA' 카테고리의 다른 글
객체지향(제네릭(Generic)) (0) | 2024.07.24 |
---|---|
예외처리(Exception) (0) | 2024.07.24 |
객체지향(오버로딩 (Overloading), 오버라이딩 (Overriding)) (0) | 2024.07.24 |
객체지향(상속) (0) | 2024.07.24 |
객체지향(지역 변수, 상수) (1) | 2024.07.24 |