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