자바 추상클래스와 인터페이스 차이

반응형
SMALL

자바에서 추상 클래스인터페이스는 둘 다 클래스가 특정 기능을 수행하도록 강제하는 용도로 사용되지만, 그 사용 방식과 역할이 다르다.

 

추상 클래스

추상 클래스는 다른 클래스가 상속받아 사용할 수 있도록 공통된 속성과 메서드를 정의한 클래스다. 모든 메서드가 추상 메서드일 필요는 없으며, 일부는 구현할 수 있다. 추상 클래스는 하위 클래스에서 구체적으로 구현해야 할 메서드를 정의함으로써 부분적으로 공통된 기능을 상속하고, 일부 기능은 강제로 구현하게 할 때 유용하다.

 

특징

  • abstract 키워드를 사용하여 선언한다.
  • 일반 메서드추상 메서드를 모두 포함할 수 있다.
  • 객체로 인스턴스화할 수 없으며, 반드시 하위 클래스에서 상속받아 사용해야 한다.
  • 필드(변수)를 가질 수 있어 상태 정보를 저장할 수 있다.
  • 단일 상속만 지원한다.
// 추상 클래스 선언
abstract class Animal {
    // 일반 메서드 (구현된 메서드)
    public void eat() {
        System.out.println("먹고 있다.");
    }

    // 추상 메서드 (하위 클래스에서 구현해야 함)
    public abstract void sound();
}

// 추상 클래스를 상속받는 Dog 클래스
class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}

// 추상 클래스를 상속받는 Cat 클래스
class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}

// 테스트 코드
public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();

        dog.eat();      // 출력: 먹고 있다.
        dog.sound();    // 출력: 멍멍

        cat.eat();      // 출력: 먹고 있다.
        cat.sound();    // 출력: 야옹
    }
}

 

인터페이스

인터페이스는 클래스가 구현해야 할 동작을 정의하는 틀이다. 인터페이스는 클래스가 특정 기능을 구현하도록 도와주, 클래스가 여러 개의 인터페이스를 구현할 수 있는 다중 구현이 가능하다. 인터페이스에 선언된 메서드는 모두 추상 메서드이므로 구현 코드가 없다.

 

특징

  • interface 키워드를 사용하여 선언한다.
  • 모든 메서드는 구현 없이 시그니처만 선언된다.
  • 다중 구현이 가능하여 여러 인터페이스를 동시에 구현할 수 있다.
  • 필드는 public static final 상수만 가질 수 있다.
  • Java 8 이후부터 default 및 static 메서드 구현이 가능하여 일부 구현을 포함할 수 있다.
// Flyable 인터페이스 선언
interface Flyable {
    // 추상 메서드 (fly 기능을 강제)
    void fly();
}

// Swimmable 인터페이스 선언
interface Swimmable {
    // 추상 메서드 (swim 기능을 강제)
    void swim();
}

// 인터페이스를 구현하는 Duck 클래스
class Duck implements Flyable, Swimmable {
    @Override
    public void fly() {
        System.out.println("오리가 날고 있다.");
    }

    @Override
    public void swim() {
        System.out.println("오리가 수영하고 있다.");
    }
}

// 테스트 코드
public class Main {
    public static void main(String[] args) {
        Duck duck = new Duck();

        duck.fly();    // 출력: 오리가 날고 있다.
        duck.swim();   // 출력: 오리가 수영하고 있다.
    }
}

장단점

추상 클래스 장점

  • 상태와 행동을 모두 가질 수 있어 유연성이 높다.
  • 공통 기능을 미리 구현하여 코드 재사용성을 높일 수 있다.

추상 클래스 단점

  • 단일 상속만 지원하므로, 다중 상속이 필요한 경우 제한적이다.
  • 필드(상태 정보)를 포함하고 있어 인터페이스보다 구조적으로 덜 유연하다.

인터페이스 장점

  • 다중 구현이 가능하여, 하나의 클래스가 여러 기능을 수행하도록 만들 수 있다.
  • 동작을 규격화하여 일관된 사용 방식을 강제할 수 있다.

인터페이스 단점

  • 상수 외의 필드 사용이 불가하여 상태를 유지할 수 없다.
  • 모든 메서드를 구현해야 하므로, 구현해야 할 내용이 많아질 수 있다.
구분 추상 클래스 (Abstract Class) 인터페이스 (Interface)
선언 방식 abstract 키워드를 사용 interface 키워드를 사용
메서드 구성 일반 메서드와 추상 메서드 모두 가능 모든 메서드는 추상 메서드로, Java 8 이후 default 메서드 가능
필드 사용 일반 필드와 상수 모두 사용 가능 public static final 상수만 가능
상속 및 구현 단일 상속만 가능 다중 구현 가능
사용 목적 공통 기능의 구현과 일부 메서드 구현을 도 클래스에 특정 동작을 도와주며 일관성 유지
상태 유지 여부 필드 사용이 가능하여 상태 유지 가능 필드를 가질 수 없어 상태를 유지할 수 없음
기본 메서드 default 메서드 불가 Java 8 이후 default와 static 메서드로 일부 구현 가능
주요 사용 사례 공통된 속성을 가진 계층 구조에서 상위 클래스 역할 동작 규격화 및 다중 동작 구현이 필요한 경우
객체 생성 직접 생성 불가 (하위 클래스 통해 생성 가능) 직접 생성 불가 (구현 클래스를 통해 생성 가능
반응형
LIST

'cs정리' 카테고리의 다른 글

스프링 빈 주입시 생기는 문제들  (0) 2024.11.09
SPRING BEAN이란  (0) 2024.11.09
ORM 구현체- HIBERNATE, MYBATIS  (2) 2024.10.30
SPRING BOOT ORM이란?  (0) 2024.10.30
SPRING BOOT JPA란?  (0) 2024.10.30