Java의 **추상화(Abstraction)**는 객체 지향 프로그래밍(OOP)의 네 가지 핵심 원칙 중 하나로, 복잡한 시스템의 세부 구현을 숨기고 중요한 부분만 드러내는 방법을 의미합니다. 추상화를 통해 사용자는 시스템이 어떻게 동작하는지보다는 무엇을 하는지에 집중할 수 있게 됩니다. 추상화는 두 가지 주요 방법으로 구현됩니다: 추상 클래스인터페이스입니다.

1. 추상 클래스 (Abstract Class)

예시:

abstract class Animal {
    abstract void sound(); // 추상 메서드

    void breathe() { // 일반 메서드
        System.out.println("숨을 쉰다.");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍!");
    }
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("야옹!");
    }
}

위의 예시에서 Animal 클래스는 추상 클래스이며, sound() 메서드는 추상 메서드입니다. 이를 상속받은 DogCat 클래스는 각각의 방식으로 sound() 메서드를 구현합니다.

2. 인터페이스 (Interface)

예시:

interface Animal {
    void sound(); // 추상 메서드
}

class Dog implements Animal {
    @Override
    public void sound() {
        System.out.println("멍멍!");
    }
}

class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("야옹!");
    }
}

위 예시에서 Animal 인터페이스는 sound() 메서드를 정의하고, DogCat 클래스는 이를 구현합니다.

추상 클래스와 인터페이스의 차이점

항목 추상 클래스 인터페이스
상속 하나의 클래스만 상속 가능 여러 인터페이스를 구현할 수 있음
메서드 일반 메서드와 추상 메서드 모두 가짐 자바 8 이전에는 추상 메서드만 가짐 (디폴트 메서드 가능)
변수 인스턴스 변수 가질 수 있음 상수만 선언 가능
사용 목적 기본적인 동작을 제공하고 일부만 재정의 여러 클래스에 공통 행동 정의

추상화의 장점