추상클래스 (Abstract Class)
추상클래스는 객체를 생성할 수 없는 클래스로, abstract를 사용하여 선언된다.
일반적인 클래스처럼 변수와 메서드를 가질 수 있지만, 하나 이상의 추상메서드를 포함할 수 있다.
추상메서드란 메서드를 선언만하고 구현은 하위 클래스에서 오버라이드하는 메서드를 의미한다.
일반적인 메서드 또한 가질 수 있다.
직접 객체 생성은 불가능하지만, 생성자를 통해 자식클래스에서 호출이 가능하다.
변수와 메서드에 접근제어자를 사용할 수 있다.
다중 상속은 불가능하다.
부모클래스에서 공통 기능을 구현하고, 일부 메서드를 하위클래스의 특징에 맞게 구현을 강제할 때 사용한다.
코드의 재사용성을 높혀준다.
// 추상 클래스 선언
abstract class Animal {
String name;
// 생성자
Animal(String name) {
this.name = name;
}
// 추상 메서드 (구현 없이 선언만)
abstract void makeSound();
// 일반 메서드
void sleep() {
System.out.println(name + " is sleeping.");
}
}
// 추상 클래스를 상속하는 하위 클래스
class Dog extends Animal {
Dog(String name) {
super(name);
}
// 추상 메서드 구현 (반드시 오버라이딩해야 함)
@Override
void makeSound() {
System.out.println(name + " says: Woof! Woof!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Buddy");
dog.makeSound(); // "Buddy says: Woof! Woof!"
dog.sleep(); // "Buddy is sleeping."
}
}
인터페이스
인터페이스는 완전히 추상적인 클래스로, 모든 메서드는 기본적으로 abstract이며, 구현부가 없다. 즉 추상메서드와 상수만을 포함할 수 있는 구조이다. abstract키워드는 생략해도 자동 적용된다.
모든변수는 public static final(상수)이다.
다중 구현이 가능하다. 클래스는 하나만 상속이 가능하지만, 인터페이스는 여러개 구현이 가능하다.
Java 8 이후부터는 default 및 static 메서드 추가가 가능하다.
default 메서드 : 기본 구현을 제공하는 메서드(오버라이딩 가능)
static 메서드 : 인스턴스 없이 호출 가능한 정적 메서드
클래스 간의 공통된 행동을 정의하고 싶을 때
다중 상속이 필요할 때
구현을 강제하고 싶을 때
// 인터페이스 선언
interface Animal {
// 추상 메서드 (자동으로 public abstract)
void makeSound();
// Java 8부터 추가된 default 메서드
default void sleep() {
System.out.println("Sleeping...");
}
}
// 클래스에서 인터페이스 구현
class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("Meow! Meow!");
}
}
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.makeSound(); // "Meow! Meow!"
cat.sleep(); // "Sleeping..."
}
}
| 비교 항목 | 추상 클래스 (Abstract Class) | 인터페이스 (Interface) |
|---|---|---|
| 객체생성 | 불가능 | 불가능 |
| 메서드 | 일반메서드 + 추상메서드 | only 추상메서드(default, static 메서드 가능) |
| 변수 | 일반 변수 선언 가능 | 상수만 선언 가능 |
| 생성자 | 있음 | 없음 |
| 다중 상속 | 불가능 | 가능 |
| 사용 목적 | 상속을 통해 기능을 확장 | 다형성을 극대화하고, 특정 기능을 강제 |