JAVA/Information

[Java] 추상클래스와 인터페이스의 차이점?

Huiyeon 2024. 3. 20. 06:32

 

 

안녕하세요 오늘은 추상클래스와 인터페이스의 차이점에 대해 알아보려고 합니다.

 

1. 목적

  • 추상클래스: 추상클래스는 부분적으로 구현된 클래스로, 상속받는 자식 클래스에게 특정 메소드의 구현을 강제하기 위해 사용됩니다. 즉, 일부 공통적인 기능을 구현하고 나머지는 상속받는 클래스에서 구현합니다.
  • 인터페이스: 인터페이스는 모든 메소드가 추상메소드로만 이루어져 있으며, 특정 기능을 구현하는 데 필요한 메소드의 명세만을 제공합니다. 클래스가 인터페이스를 구현할 때는 인터페이스에 정의된 모든 메소드를 구현해야 합니다.

 

 

2. 구현 방법

  • 추상클래스: 하나의 추상클래스만 상속받을 수 있습니다.

ex) 동물을 추상화한 Animal 클래스에서 sleep메소드는 모든 동물이 공통으로 가지는 행위입니다.

makeSound는 동물마다 다르기 때문에 추상 메소드로 선언합니다.

그리고 Cat 클래스에서 Animal클래스를 상속받아 makeSound메소드를 구현합니다.

abstract class Animal {
    // 추상 메소드
    abstract void makeSound();

    // 구현된 메소드
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    // 추상 클래스에서 상속받은 추상 메소드 구현
    void makeSound() {
        System.out.println("Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        Cat myCat = new Cat();
        myCat.makeSound(); // Meow
        myCat.sleep();     // Zzz
    }
}

 

 

  • 인터페이스: 여러 인터페이스를 구현할 수 있습니다.

ex) Movable 인터페이스에는 move라는 메소드가 정의되어 있고, Car와 Bicycle 클래스에서 이 인터페이스를 구현해보도록 하겠습니다. 각 클래스에는 move 메소드를 원하는 방식대로 구현하시면 됩니다.

interface Movable {
    void move();
}

class Car implements Movable {
    public void move() {
        System.out.println("차가 네 바퀴로 움직입니다.");
    }
}

class Bicycle implements Movable {
    public void move() {
        System.out.println("자전거가 두 바퀴로 움직입니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car();
        Bicycle myBike = new Bicycle();

        myCar.move(); // 차가 네 바퀴로 움직입니다.
        myBike.move(); // 자전거가 두 바퀴로 움직입니다.
    }
}

 

위에 두 예시를 보시는 거와 같이 각각 특정 상황에서 유용하게 사용하실 수 있습니다.

-> 추상클래스는 공통된 기능을 가진 클래스들의 '계층 구조' 를 구성할때 유용

-> 인터페이스는 서로 다른 클래스들이 동일한 기능을 구현 할때 사용

 

 

3. 멤버 변수

  • 추상클래스: 상패(멤버 변수)를 가질 수 있습니다.
  • 인터페이스: 상태를 가질 수 없고, 상수만 가질 수 있습니다.

 

 

4. 접근 제어자

  • 추상클래스: 다양한 접근 제어자를 사용하실 수 있습니다. (public, protected, prevate 등)
  • 인터페이스: default메소드와 static 메소드, Java 9부터는 private 메소드도 사용이 가능합니다.

 

 

 

반응형