자바에서 추상 클래스와 인터페이스는 객체 지향 프로그래밍에서 중요한 개념입니다. 추상 클래스와 인터페이스는 각각 다른 목적과 사용 방법을 가지고 있으며, 올바르게 사용함으로써 더욱 유연하고 재사용 가능한 코드를 작성할 수 있습니다.
추상 클래스 (Abstract Class)
추상 클래스는 하나 이상의 추상 메소드와 일반 메소드를 포함할 수 있는 클래스입니다. 추상 메소드는 선언만 되어 있고 구현 내용이 없으므로, 실제 사용될 때 서브 클래스에서 반드시 구현되어야 합니다.
추상 클래스는 다음과 같은 경우에 사용될 수 있습니다:
- 서로 다른 클래스 간에 공통된 속성과 동작을 갖는 경우
- 서브 클래스에서 공통된 기능을 재사용하고자 할 때
- 상속을 통해 다형성을 구현하고자 할 때
public abstract class Animal {
public abstract void makeSound();
public void sleep() {
System.out.println("Zzz");
}
}
위의 예시에서 Animal
추상 클래스는 makeSound()
라는 추상 메소드와 sleep()
라는 일반 메소드를 가지고 있습니다. Animal
을 상속받는 서브 클래스는 makeSound()
를 구현해야 하며, sleep()
메소드는 공통된 기능으로 사용될 수 있습니다.
인터페이스 (Interface)
인터페이스는 추상 메소드와 상수만을 가지는 참조 타입입니다. 인터페이스는 클래스가 가져야 할 동작을 명시하는 설계 도구로 사용됩니다. 클래스는 인터페이스를 구현함으로써 인터페이스에서 선언된 메소드를 구현해야 합니다.
인터페이스는 다음과 같은 경우에 사용될 수 있습니다:
- 클래스의 동작을 정의하고, 여러 클래스에서 공통적으로 사용하는 기능을 강제하기 위해
- 다중 상속을 흉내내며, 여러 인터페이스를 동시에 구현하는 것이 가능하도록 하기 위해
- 클라이언트와 서비스 간의 계약을 정의하는 데 사용될 때
public interface Flyable {
void fly();
}
public class Bird implements Flyable {
public void fly() {
System.out.println("Flying high in the sky");
}
}
위의 예시에서 Flyable
인터페이스는 fly()
라는 추상 메소드를 가지고 있습니다. Bird
클래스는 Flyable
인터페이스를 구현하며, fly()
메소드를 구현합니다.
결론
추상 클래스와 인터페이스는 객체 지향 프로그래밍에서 코드의 재사용성을 높이고 유연성을 제공하는 중요한 도구입니다. 추상 클래스는 서로 다른 클래스 간의 공통된 동작을 추상화하고 재사용할 수 있으며, 인터페이스는 클래스 간의 계약을 정의하여 다형성을 구현할 수 있도록 합니다. 올바르게 사용함으로써 코드의 유지보수성을 높이고, 확장 가능한 애플리케이션을 구축할 수 있습니다.