Backend/Java

[Java] abstract class 와 interface class의 차이

누구세연 2024. 7. 17. 23:39

추상 클래스와 인터페이스는 객체지향 프로그래밍에서 중요한 개념으로, 클래스의 다형성을 지원하고 코드의 재사용성을 높이는데 큰 역할을 합니다. 이 두 가지의 차이점을 명확히 이해하는 것은 효율적인 설계와 구현을 위해 필수적이라고 생각합니다!

이번글에서는 두 클래스의 개념과 차이점에 대해 알아보도록 하겠습니다.🤓

 

추상 클래스(abstract class)

추상클래스는 공통된 속성이나 동작을 정의하는 데 사용되는 클래스입니다. (다른 클래스들이 상속받아 사용할 수 있는 기본 틀 🧐)

인스턴스를 직접 생성할 수 있으며, 상속을 통해 하위 클래스에서 구현되어야 하는 메서드를 포함할 수 있습니다.

  • 인스턴스 생성 불가
    추상 클래스 자체로는 객체를 생성할 수 없습니다.
  • 추상 메서드
    하나 이상의 추상 메서드를 포함할 수 있으며, 이를 상속받는 하위 클래스에서 구현해야 합니다.
  • 일반 메서드와 속성 포함 가능
    추상 클래스는 추상 메서드뿐만 아니라 구현된 메서드와 속성도 가질 수 있습니다.
  • 단일 상속
    한 클래스는 하나의 추상 클래스만 상속받을 수 있습니다.
abstract class Animal {
    // 추상 메서드: 하위 클래스에서 구현해야 함
    abstract void makeSound();
    
    // 일반 메서드
    void breathe() {
        System.out.println("Breathing...");
    }
}

class Dog extends Animal {
    // 추상 메서드 구현
    void makeSound() {
        System.out.println("Bark");
    }
}

// 객체 생성 불가 예제
// Animal animal = new Animal(); // 컴파일 에러: 추상 클래스의 인스턴스를 생성할 수 없습니다.

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // 출력: Bark
        dog.breathe();   // 출력: Breathing...
    }
}

 

 

인터페이스(Interface)

인터페이스는 클래스가 구현해야 하는 메서드의 목록을 정의합니다.

모든 메서드는 기본적으로 추상 메서드이며, 다중 상속을 지원합니다. (인터페이스 자체는 메서드의 구현을 포함하지 않습니다!)

  • 추상 메서드
    인터페이스에 선언된 모든 메서드는 기본적으로 추상 메서드입니다.
  • 다중 상속 가능
    한 클래스가 여러 인터페이스를 구현할 수 있습니다.
  • 디폴트 메서드와 정적 메서드
    Java8부터 인터페이스는 디폴트 메서드(구현을 가진 메서드)와 정적 메서드를 포함할 수 있습니다.
  • 상수만 포함 가능
    인터페이스 내의 모든 필드는 기본적으로 'public static final'입니다.
interface Animal {
    // 추상 메서드
    void makeSound();
}

class Dog implements Animal {
    // 인터페이스 메서드 구현
    public void makeSound() {
        System.out.println("Bark");
    }
}

// 상수만 포함 예제
interface Constants {
	// 인스턴스 변수 포함 불가 예제
    // int age; // 컴파일 에러: 인터페이스의 변수는 상수여야 합니다.
    int MAX_AGE = 100; // 인터페이스의 변수는 상수여야 함
}

// 다중 상속 예제
interface Mammal {
    void feed();
}

class Cat implements Animal, Mammal {
    public void makeSound() {
        System.out.println("Meow");
    }

    public void feed() {
        System.out.println("Feeding kittens...");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // 출력: Bark

        Cat cat = new Cat();
        cat.makeSound(); // 출력: Meow
        cat.feed();      // 출력: Feeding kittens...
    }
}

 

 

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

특성  추상 클래스 인터페이스
인스턴스화 불가능 불가능
메서드 구현 구현된 메서드와 추상 메서드 모두 포함 가능 기본적으로 추상 메서드만 포함 (디폴트 메서드와 정적 메서드는 예외)
다중 상속 불가능 (단일 상속만 가능) 가능
필드 인스턴스 변수, 클래스 변수 포함 가능 상수만 포함 가능 (public static final)
사용 목적 공통된 속성과 동작을 정의하고 재사용성 높이기 특정 기능을 구현하도록 강제하기

 

 

언제 무엇을 사용할까?

추상 클래스 사용 사례

  • 공통된 기능 공유
    여러 클래스에서 공통된 속성과 메서드를 공유할 때 사용합니다.
  • 부분 구현 제공
    기본적인 기능을 제공하면서 하위 클래스에서 세부 구현을 강제하고 싶을 때 유용합니다.

인터페이스 사용 사례

  • 다중 상속 필요
    Java는 클래스의 다중 상속을 지원하지 않지만, 인터페이스를 통해 여러 기능을 구현할 수 있습니다.
  • 특정 행동을 강제
    클래스가 특정 메서드를 반드시 구현하게 하고 싶을 때 사용합니다.

 

 

💡추상 클래스와 인터페이스는 객체 지향 프로그래밍에서 매우 중요한 개념입니다. 추상 클래스는 공통된 기능을 공유하고 부분적인 구현을 제공할 때 유용하며, 인터페이스는 다중 상속이 필요하거나 특정 행동을 강제할 때 유용합니다. 이 두 개념을 잘 이해하고 적절하게 활용하면 더 효율적이고 유지보수하기 쉬운 코드를 작성할 수 있을 것이라고 생각합니다.