JAVA/기초

[Java] 추상(abstract) 클래스와 인터페이스(Interface)

안양큰스님 2024. 2. 27. 00:59

인터페이스(interface)와 추상 클래스(abstract class)는 모두 객체 지향 프로그래밍에서 다형성을 구현하는 데 사용되는 중요한 개념입니다. 이 둘은 비슷한 목적을 가지고 있지만 몇 가지 중요한 차이점이 있습니다.

 

인터페이스(Interface)

  • 정의 : 인터페이스는 메서드 선언만 포함하는 추상적인 개념으로, 구현되지 않은 메서드의 시그니처만을 가지고 있습니다.
  • 선언 : `interface` 키워드를 사용하여 선언됩니다.
  • 상속 : 인터페이스는 다른 인터페이스로부터만 상속할 수 있습니다.
  • 다중 상속 : 여러 개의 인터페이스를 구현할 수 있습니다.
  • 필드 : 상수 필드만을 가질 수 있으며, 이들은 자동으로 `public static final`로 선언됩니다.
  • 구현 : 클래스가 인터페이스를 구현할 때는 `implements` 키워드를 사용합니다.

추상 클래스(Abstract Class)

  • 정의 : 추상 클래스는 하나 이상의 추상 메서드를 포함하며, 일반 메서드와 필드도 포함할 수 있습니다.
  • 선언 : `abstract` 키워드를 사용하여 선언됩니다.
  • 상속 : 추상 클래스는 다른 클래스로부터 상속할 수 있으며, 인터페이스로부터도 상속받을 수 있습니다.
  • 단일 상속 : 단 하나의 추상 클래스만을 상속할 수 있습니다.
  • 필드 : 일반 필드와 추상 메서드 외에도 일반 메서드를 가질 수 있습니다.
  • 구현 : 클래스가 추상 클래스를 상속할 때는 `extends` 키워드를 사용합니다.

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

  1. 구현 내용 : 인터페이스는 메서드의 시그니처만을 정의하고 구현 내용은 없습니다. 반면에 추상 클래스는 일반적인 메서드와 필드를 가질 수 있으며, 추상 메서드 또는 일반 메서드로 선언될 수 있습니다.

  2. 다중 상속 vs 단일 상속 : 인터페이스는 여러 개의 인터페이스를 동시에 구현할 수 있지만, 추상 클래스는 하나의 추상 클래스만을 상속할 수 있습니다.

 

인터페이스 예시

interface Animal {
    void makeSound();
}

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

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

추상 클래스 예시

abstract class Shape {
    protected String color;
    
    public Shape(String color) {
        this.color = color;
    }
    
    abstract double area();
    
    public void display() {
        System.out.println("도형의 색상: " + color);
    }
}

class Rectangle extends Shape {
    private double width;
    private double height;
    
    public Rectangle(String color, double width, double height) {
        super(color);
        this.width = width;
        this.height = height;
    }
    
    public double area() {
        return width * height;
    }
}

 

 

위의 예시에서는 인터페이스와 추상 클래스를 사용하여 각각 동물의 소리와 도형의 넓이를 구하는 예시를 보여주었습니다. 이러한 설계 패턴은 객체 지향 프로그래밍에서 중요한 역할을 합니다.

'JAVA > 기초' 카테고리의 다른 글

[Java] 다중 인터페이스(다중 상속)  (0) 2024.02.27
[Java] 인터페이스(interface)와 디폴트(default) 메서드  (1) 2024.02.27
[Java] Class 란?  (0) 2024.02.27
[JAVA] 가변인수(VarArgs)  (0) 2024.02.20
[JAVA] BigDecimal 클래스  (0) 2024.02.20