[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는 만드는 쪽

Image


실제로 Bird2로 바꾸면 기존 Bird 객체는 에러로 인해 수많은 코드를 고쳐야 함.

Image


이를 Fly 인터페이스를 만들어 Bird나Bird2에 implements 하면 이런 에러 걱정이 없음!

Image


1. 실무 예시: 3가지 파일 생각

3가지 파일 생각 → 인터페이스, 만드는쪽, 사용하는쪽

  1. AboutMe.java → 인터페이스

Image

  1. AboutMeImpl.java → 만드는쪽

Image

  1. Test.java → 사용하는쪽

    부모 p = new 자식(); 형태로 사용 (abstract도 마찬가지)

Image


2. 실무 예시: 협업 방식은?

먼저 jar 해당 파일은?? 3가지 파일 중 만드는쪽의 파일을 의미(AboutMeImpl.java)
참고로 jar 만드는건 export를 사용 → 이후 jar에 구성될 파일 잘 선택

Image


jar을 가져오는건 아래 화면에서 Add External JARs…

Image


정상적으로 import 및 실행!
이렇게 따로 분리해서 개발이 가능한 것!

Image



선택 기준

추상 클래스 인터페이스
관련성 높은 클래스 관련성 낮은 클래스
is-a 관계 can-do 관계 (기능)


관련성이 비교적 없는 클래스(인터) vs 관련성이 높은 클래스(추상)

Image

추상 클래스는 상속을 통한 확장을, 인터페이스는 구현을 통한 명세를 제공하므로 각각의 특성을 고려하여 적절히 선택해야 합니다.

댓글남기기