728x90
📌 추상 클래스 (abstract class)
public abstract class Shape {
public abstract void draw();
}
- 인스턴스 생성 불가, 반드시 자식 클래스에서 상속 받아야 함
- 공통 로직은 직접 구현, 자식 클래스에서 달라지는 부분은 추상 메서드로 강제
- 객체 생성 시, 부모 생성자 먼저 실행
- 중복된 필드나 공통 메서드를 통합해 상속할 수 있음
- 구현 강제성과 재사용성을 동시에 제공
abstract class Animal {
public abstract void makeSound(); // 강제 구현
public void eat() {
System.out.println("냠냠"); // 공통 구현
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("멍멍");
}
}
📌 인터페이스 (interface)
interface Animal {
int A = 10; // public static final
void eat(); // public abstract
}
- 모든 멤버 변수는 상수(public static final)
- 모든 메서드는 기본적으로 public abstract
- 다중 구현(implements) 가능
- 객체 생성 불가, 역할 정의에 집중 (기능 중심 설계)
- 결합도를 낮추고 유연한 설계에 적합 (OOP 원칙)
- Java 8 이후부터는 default/static 메서드 구현 가능
interface Pet {
void play();
default void introduce() {
System.out.println("ㅎㅇ");
}
}
class Cat implements Animal, Pet {
public void eat() {
System.out.println("냠냠");
}
}
📌 추상 클래스 vs 인터페이스 비교
| 항목 | 추상 클래스 | 인터페이스 |
| 상속 | 단일 상속 | 다중 구현 가능 |
| 변수 선언 | 인스턴스 변수 O | 상수만 가능 (final) |
| 메서드 구현 | 구현/추상 모두 가능 | Java 8부터 일부 구현 가능 (default/static) |
| 생성자 | 생성자 O (super 접근 가능) | 생성자 X |
| 설계 목적 | 공통 로직 포함 + 일부 구현 강제 | 기능 정의, 유연한 구조 설계 |
| 사용 예 | 기본 동작 공유가 필요한 경우 | 다양한 구현체가 필요한 경우 |
📌 Tip
- **상속 관계(“is-a”)**가 명확하고 일부 구현이 필요한 경우 → 추상 클래스
- 여러 객체가 기능만 공유하고 구현은 달라야 할 경우 → 인터페이스
- Java 8+ 이후부터는 인터페이스로도 구현 로직이 가능해져 경계가 다소 유연
728x90
'Java' 카테고리의 다른 글
| [JAVA] String vs StringBuffer & equals() vs hashCode() (1) | 2025.08.02 |
|---|---|
| [JAVA] 변수와 제어자 (3) | 2025.08.02 |
| [JAVA] Generics Type (0) | 2025.08.01 |
| Java (0) | 2021.11.15 |