[Java 추상화] 추상 클래스와 인터페이스 차이점과 활용 가이드
Java에서 추상화를 구현하는 두 가지 핵심 메커니즘인 추상 클래스와 인터페이스의 특징, 차이점, 활용 방법을 설명하는 문서입니다.
추상 클래스 (Abstract Class)
핵심 특징
- 일반 메서드(구현부)와 추상 메서드 모두 포함 가능
- 단일 상속만 가능
- extends 키워드 사용
abstract class Animal {
protected String name;
public abstract void makeSound(); // 추상 메서드
public void eat() { // 일반 메서드
System.out.println("eating...");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
인터페이스 (Interface)
핵심 특징
- 모든 멤버변수는 public static final
- 모든 메서드는 public abstract (JDK 8 이전)
- 다중 상속 가능
- implements 키워드 사용
interface Flyable {
void fly(); // public abstract 자동 적용
int MAX_HEIGHT = 10000; // public static final 자동 적용
}
interface Fightable {
int fire();
}
//다중 상속 -> 클래스와 다르게 인터페이스는 가능
public interface Test extends Flyable, Fightable {
void upgrade();
}
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("Bird is flying");
}
}
JDK 8 이후 추가 기능
💡 새로운 메서드 타입
- default 메서드: 구현부 포함 가능
- abstract가 아닌 기본 메서드라 강제 오버라이딩X
- 단, 동일한 이름을 갖는 구현부 끼리는 충돌 가능성 -> 오버라이딩으로 해결
- static 메서드: 인터페이스에서 직접 구현
- 클래스처럼 구현체 없이 인터페이스로 바로 메서드 접근 가능
interface Modern {
void abstractMethod();
default void newMethod() {
System.out.println("Default method");
}
static void staticMethod() {
System.out.println("Static method");
}
}
//static 메서드 사용 예시
Modern.staticMethod();
실무 활용 실습 -> 중요
왜 사용? 의존성을 완화
분류 2가지 → 사용하는 쪽, 만드는 쪽
- Test.java는 사용하는 쪽
- Bird.java는 만드는 쪽
실제로 Bird2로 바꾸면 기존 Bird 객체는 에러로 인해 수많은 코드를 고쳐야 함.
이를 Fly 인터페이스를 만들어 Bird나Bird2에 implements 하면 이런 에러 걱정이 없음!
1. 실무 예시: 3가지 파일 생각
3가지 파일 생각 → 인터페이스, 만드는쪽, 사용하는쪽
- AboutMe.java → 인터페이스
- AboutMeImpl.java → 만드는쪽
-
Test.java → 사용하는쪽
부모 p = new 자식();
형태로 사용 (abstract도 마찬가지)
2. 실무 예시: 협업 방식은?
먼저 jar 해당 파일은?? 3가지 파일 중 만드는쪽의 파일을 의미(AboutMeImpl.java)
참고로 jar 만드는건 export를 사용 → 이후 jar에 구성될 파일 잘 선택
jar을 가져오는건 아래 화면에서 Add External JARs…
정상적으로 import 및 실행!
이렇게 따로 분리해서 개발이 가능한 것!
⚡ 선택 기준
추상 클래스 | 인터페이스 |
---|---|
관련성 높은 클래스 | 관련성 낮은 클래스 |
is-a 관계 | can-do 관계 (기능) |
관련성이 비교적 없는 클래스(인터) vs 관련성이 높은 클래스(추상)
추상 클래스는 상속을 통한 확장을, 인터페이스는 구현을 통한 명세를 제공하므로 각각의 특성을 고려하여 적절히 선택해야 합니다.
댓글남기기