JAVA
[JAVA] Abstract Class(추상 클래스)와 Interface (인터페이스)
그건모르겠고
2024. 7. 11. 14:08
728x90
추상 클래스 (Abstract Class)
설명
- 정의: 추상 클래스는 하나 이상의 추상 메서드를 포함하는 클래스입니다. 추상 메서드는 구현이 없는 메서드로, 서브클래스에서 반드시 구현해야 합니다.
- 특징:
- 인스턴스를 직접 생성할 수 없음.
- 추상 메서드뿐만 아니라 구현된 메서드도 포함할 수 있음.
- 상태(필드)와 구현(메서드)을 가질 수 있음.
- 단일 상속만 가능.
용도
- 기본 구현 제공: 공통된 기능을 자식 클래스에 제공하면서, 일부 메서드는 자식 클래스에서 구현하도록 강제하고 싶을 때 사용.
- 코드 재사용: 상속을 통해 코드 재사용을 목적으로 할 때 사용.
예제
// 추상 (부모) 클래스
abstract class Animal {
// 필드
private String name;
// 생성자
public Animal(String name) {
this.name = name;
}
// 추상 메서드
public abstract void makeSound();
// 구현된 메서드
public void sleep() {
System.out.println(name + " is sleeping");
}
}
// 자식 클래스
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("Woof");
}
}
class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("Meow");
}
}
인터페이스 (Interface)
설명
- 정의: 인터페이스는 모든 메서드가 추상 메서드인 일종의 추상 타입입니다. 자바 8부터는 디폴트 메서드(기본 구현을 가진 메서드)와 정적 메서드도 포함할 수 있습니다.
- 특징:
- 모든 메서드는 기본적으로 추상적이며, public이며, 구현되지 않습니다.
- 상태(필드)를 가질 수 없음, 단 상수는 가질 수 있음 (public static final).
- 다중 상속이 가능 (여러 인터페이스를 구현할 수 있음).
- 자바 8부터 디폴트 메서드와 정적 메서드를 가질 수 있음.
- 자바 9부터 private 메서드를 가질 수 있음.
용도
- 다중 상속: 클래스가 여러 타입을 구현해야 할 때 사용.
- 행동의 명세: 클래스가 특정 행동을 하도록 명세할 때 사용.
- 추상화 계층 제공: 다양한 클래스가 같은 인터페이스를 구현함으로써 코드의 유연성을 높임.
예제
// 인터페이스
interface Animal {
// 추상 메서드
void makeSound();
// 디폴트 메서드 (Java 8+)
default void sleep() {
System.out.println("Sleeping");
}
}
// 구현 클래스
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("Woof");
}
}
class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("Meow");
}
}
차이점
특징 | 추상 클래스 (Abstract Class) | 인터페이스 (Interface) |
인스턴스 생성 | 인스턴스 생성 불가 | 인스턴스 생성 불가 |
메서드 | 추상 메서드와 구현된 메서드를 포함할 수 있음 | 모든 메서드는 추상 메서드, Java 8+에서는 디폴트 및 정적 메서드 포함 가능 |
필드 | 필드를 가질 수 있음 | 상수(public static final)만 가질 수 있음 |
상속 | 단일 상속 | 다중 상속 가능 |
용도 | 기본 구현 제공 및 코드 재사용 | 행동의 명세 및 다중 상속 구현 |
이와 같이 추상 클래스와 인터페이스를 통해 코드의 재사용성과 유연성을 높일 수 있으며, 상황에 따라 적절한 선택을 통해 더 나은 설계를 할 수 있습니다.