인터페이스 및 추상 클래스 (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
객체를 할당하여 다형성을 구현합니다.