인터페이스 및 추상 클래스 (Interfaces and Abstract Classes)
인터페이스 (Interfaces)
인터페이스는 Java에서 클래스와 비슷하지만, 다음과 같은 점에서 다릅니다:
- 모든 메서드는 추상 메서드입니다. 즉, 메서드 본문이 없고 세미콜론(
;)으로 끝납니다. - 모든 필드는 상수로 선언되며, 자동으로 
public,static,final로 설정됩니다. - 다중 상속이 가능합니다.
 
인터페이스 예제:
// 인터페이스 정의
interface Animal {
    void makeSound(); // 추상 메서드 선언
}
// 인터페이스 구현
class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍!");
    }
}
// 인터페이스 사용 예제
public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        myDog.makeSound(); // 출력: 멍멍!
    }
}
위의 예제에서 Animal 인터페이스는 makeSound()라는 추상 메서드를 선언합니다. Dog 클래스는 Animal 인터페이스를 구현하여 makeSound() 메서드를 오버라이딩합니다. 인터페이스를 사용하여 다형성을 구현할 수 있습니다.
추상 클래스 (Abstract Classes)
추상 클래스는 일반 클래스와 비슷하지만, 다음과 같은 점에서 다릅니다:
- 추상 메서드를 포함할 수 있습니다. 추상 메서드는 메서드 본문이 없고 세미콜론(
;)으로 끝납니다. - 객체를 직접 생성할 수 없습니다. 즉, 인스턴스화할 수 없습니다.
 - 하위 클래스에서 추상 메서드를 반드시 구현해야 합니다.
 
추상 클래스 예제:
// 추상 클래스 정의
abstract class Shape {
    // 추상 메서드 선언
    abstract void draw();
    // 일반 메서드
    void display() {
        System.out.println("도형을 그립니다.");
    }
}
// 추상 클래스를 상속받는 하위 클래스
class Circle extends Shape {
    @Override
    void draw() {
        System.out.println("원을 그립니다.");
    }
}
// 추상 클래스 사용 예제
public class Main {
    public static void main(String[] args) {
        Shape myShape = new Circle();
        myShape.draw(); // 출력: 원을 그립니다.
        myShape.display(); // 출력: 도형을 그립니다.
    }
}
위의 예제에서 Shape 클래스는 draw() 메서드를 추상 메서드로 선언하고 있습니다. Circle 클래스는 Shape 클래스를 상속받아 draw() 메서드를 구현합니다. Main 클래스에서 Shape 타입의 변수를 선언하고 Circle 객체를 할당하여 다형성을 구현합니다.
