[Java] 추상 클래스와 인터페이스의 차이를 코드로 비교하기

eunsil·2024년 4월 21일
0

Java

목록 보기
3/6
post-thumbnail

들어가기 전에

추상 클래스는 일반 클래스와 동일하게 멤버변수와 메서드를 가지고, 추상 메서드를 추가적으로 가진다.
인터페이스는 상수만 사용하고, 모든 메서드가 추상 메서드이다. (java8 부터 default 키워드로 일반 메서드 구현 가능)

'추상 메서드' 가 무엇인가?
선언부는 있지만 구현부가 없는 메서드로, 구현체가 이를 재정의해 사용해야 하는 메서드


추상 클래스

  • 클래스들의 공통 속성들을 추출해 상위 개념으로 정하는 것
  • 추상 클래스를 상속 받아 기능을 이용하고, 확장할 수 있음
  • 단일 상속
    • 다중 상속 시 두 부모클래스가 동일한 메서드를 가지고 있다고 가정할 때, 자식클래스는 어떤 부모의 메서드를 가져와야 하는지 모호해져 부모 클래스는 1개만 상속 받을 수 있다.

인터페이스

  • 동일한 코드를 가진 객체들이 동일한 동작을 수행하는 것을 보장하는 것 (함수의 구현을 강제)
  • 어떤 객체가 특정 인터페이스를 구현했다면, 그 객체는 인터페이스의 기능을 모두 갖추고 있음을 보장하고, 그 인터페이스를 통해 객체를 제어할 수 있음을 보장
  • 다중 상속

그루밍하는 고양이를 코드로 비교해보기

추상 클래스

일반 변수, 일반 메서드, 추상 메서드를 가진다.
Animal의 이름과 어떤 소리를 내는 동물인 지 정한다.

abstract class Animal {
    String name;

    // 추상 메서드
    abstract void makeSound();

    // 일반 메서드
    void setName(String name) {
        this.name = name;
    }

    // 일반 메서드
    void printName() {
        System.out.println("Name: " + name);
    }
}

인터페이스

보통 추상 메서드만 가진다. (java8 이후 default 메서드 가능)
동물의 동작을 나타내는 추상 메서드가 있다.

interface CanGroom {
    void grooming();
}

Animal 추상 클래스를 상속 받고 CanGroom 인터페이스를 구현하는 클래스

class Cat extends Animal implements CanGroom {
    // Animal 추상 클래스의 추상 메서드 구현
    void makeSound() {
        System.out.println("Meow meow");
    }

    // CanGroom 인터페이스의 추상 메서드 구현
    public void grooming() {
        System.out.println("Groom cleanly");
    }
}

public class Main {
    public static void main(String[] args) {
        Cat cat = new Cat();
        Cat.setName("Flower");
        Cat.printName();
        Cat.makeSound();
        Cat.grooming();
    }
}

출력

Name: Flower
Meow meow
Groom cleanly

정리하기

추상 클래스와 인터페이스는 목적이 다르다.

추상 클래스
일반적인 클래스이며, 이를 상속해 기능을 확장하기 위해 사용

인터페이스
인터페이스를 구현한 객체들에 대한 사용법이 동일하며 동일한 동작을 보장하기 위해 사용


referenece

자바의 추상 클래스와 인터페이스
Interface와 Abstract class 의 차이점

0개의 댓글