Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20241114 인터페이스와 추상클래스의 용도 차이? 본문

개발Article

[TIL]20241114 인터페이스와 추상클래스의 용도 차이?

최밤빵 2024. 11. 14. 18:35

인터페이스와 추상 클래스가 무엇인지 기본적인 개념은 알지만, 이 두 가지가 실제로 어떤 상황에서 사용되는지, 각각의 용도가 어떻게 다른지 명확히 정리할 필요가 있었다.

 

▶인터페이스와 추상 클래스란?

간단히 정리하자면,

  • 인터페이스 (Interface): 인터페이스는 기능의 명세(클래스가 구현해야 할 메서드의 선언만을 정의한 것으로, 구현은하지않는다.)를 정의하는 역할을 한다. 인터페이스 안에는 메서드의 시그니처(선언부)만 포함되어 있고, 그 구현은 인터페이스를 구현하는 클래스에서 담당한다. 자바에서는 인터페이스를 통해 여러 클래스에 동일한 기능을 제공할 수 있다.
  • 추상 클래스 (Abstract Class): 추상 클래스는 일부 구현된 메서드와 일부 추상 메서드를 포함할 수 있는 클래스이다. 추상 클래스는 공통된 로직을 상속하고 싶을 때 사용하며, 이 클래스는 객체를 직접 생성할 수 없다. 추상 클래스는 다른 클래스가 이를 상속받아야만 사용할 수 있다.

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

자바에서는 인터페이스와 추상 클래스 모두 클래스 간의 공통 기능을 정의하거나 확장하는 데 사용되지만, 그 용도와 활용 방식에서 차이점이 있다.

  • 상속과 구현
    • 추상 클래스는 클래스를 상속받을 때 사용한다. 자바에서는 단일 상속만 지원하기 때문에, 한 클래스는 하나의 추상 클래스만 상속받을 수 있다. 추상 클래스는 공통적인 속성과 메서드를 여러 하위 클래스에 물려줄 때 유용하다.
    • 인터페이스구현하는 형태로 사용된다. 클래스는 여러 개의 인터페이스를 구현할 수 있기 때문에, 다중 구현을 통해 다양한 기능을 제공할 수 있다. 예를 들어, 한 클래스가 '날 수 있는 기능'과 '수영할 수 있는 기능'을 구현해야 한다면 각각의 기능을 인터페이스로 제공하고 해당 클래스를 구현하도록 할 수 있다.
  • 공통된 기능의 제공 방식
    • 추상 클래스공통된 속성과 메서드를 물려주는 것에 더 적합하다. 예를 들어, 여러 종류의 동물이 있다고 할 때, 이 동물들은 모두 '심장'이나 '호흡'과 같은 공통적인 속성을 가진다. 이러한 공통된 속성을 추상 클래스에서 정의하고 이를 상속받은 하위 클래스에서 각 동물에 특화된 로직을 구현할 수 있다.
    • 인터페이스기능을 정의할 때 사용된다. 특정 클래스가 다양한 기능을 제공해야 할 때 인터페이스가 적합하다. 예를 들어, 새와 비행기 모두 '날 수 있는' 기능을 가지고 있지만, 그 구현 방식은 전혀 다르다. 이럴 때 'Flyable'이라는 인터페이스를 정의하고, 새와 비행기가 각자의 방식으로 이를 구현하도록 할 수 있다.
  • 다중 상속과 다형성
    • 자바에서는 단일 상속만 지원하기 때문에, 한 클래스는 하나의 추상 클래스만 상속받을 수 있다. 하지만 인터페이스는 여러 개 구현할 수 있다. 이를 통해 다중 상속의 문제를 해결하고, 클래스가 여러 기능을 가질 수 있도록 도와준다. 다중 상속이 허용되지 않는 이유는, 여러 부모 클래스에서 동일한 이름의 메서드를 상속받는 경우 어떤 메서드를 사용해야 하는지 모호해지는 문제가 발생할 수 있기 때문이다.
    • 다형성 측면에서도 인터페이스는 매우 유용하다. 인터페이스를 사용하면, 특정 인터페이스 타입으로 여러 구현체를 다룰 수 있어 유연한 코드를 작성할 수 있다. 예를 들어, 여러 종류의 객체가 'Moveable' 인터페이스를 구현하고 있다면, 이 객체들을 동일한 'Moveable' 타입으로 처리할 수 있다.
  • 디폴트 메서드
    • 자바 8 이후로 인터페이스에도 디폴트 메서드를 정의할 수 있게 되었다. 디폴트 메서드는 인터페이스 내에서 기본 구현을 제공하는 메서드이다. 이를 통해 추상 클래스처럼 인터페이스에서도 기본 동작을 제공할 수 있게 되었지만, 여전히 상태(필드)를 가질 수 없기 때문에 추상 클래스와는 용도가 다르다.
    • 반면, 추상 클래스는 상태(필드)를 가질 수 있으며, 이를 통해 하위 클래스가 상속받아 사용할 수 있는 공통 속성을 정의할 수 있다. 따라서 공통적인 데이터와 기능을 함께 제공해야 한다면 추상 클래스가 더 적합하다.

▶인터페이스와 추상 클래스의 활용 예시

▷추상 클래스 예시

추상 클래스를 사용하여 여러 종류의 동물에 대한 공통적인 속성과 행동을 정의할 수 있다.

public abstract class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + "이(가) 먹고 있습니다.");
    }

    public abstract void makeSound();
}

public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    @Override
    public void makeSound() {
        System.out.println(name + "이(가) 멍멍 짖습니다.");
    }
}

→ Animal 클래스는 공통된 속성인 name과 공통적인 행동인 eat() 메서드를 가지고 있다. makeSound() 메서드는 각 동물마다 다르게 구현될 것이므로 추상 메서드로 선언하고, 이를 Dog 클래스에서 구현하였다.


▷인터페이스 예시

인터페이스를 사용하여 서로 다른 객체가 동일한 기능을 구현하도록 할 수 있다.

public interface Flyable {
    void fly();
}

public class Bird implements Flyable {
    @Override
    public void fly() {
        System.out.println("새가 날고 있습니다.");
    }
}

public class Airplane implements Flyable {
    @Override
    public void fly() {
        System.out.println("비행기가 날고 있습니다.");
    }
}

→ Flyable 인터페이스는 fly()라는 기능을 정의하고 있으며, BirdAirplane 클래스는 각자의 방식으로 이 기능을 구현하고 있다. 이를 통해 서로 다른 객체가 동일한 기능을 가지지만, 각기 다른 방식으로 동작하도록 만들 수 있다.


인터페이스와 추상 클래스는 모두 코드의 유지보수성과 확장성을 높이기 위해 사용된다. 그러나 그 용도와 활용 방식은 다르다. 추상 클래스는 공통된 속성과 메서드를 상속받아 재사용하기 위한 용도로, 인터페이스는 여러 클래스에 걸쳐 공통된 기능을 정의하고 다중 구현을 가능하게 하기 위한 용도로 사용된다. 따라서 상황에 맞게 이 둘을 적절히 사용하는 것이 중요하다.

'개발Article' 카테고리의 다른 글

[TIL]20241116 @Data를 써도 될까?  (0) 2024.11.16
[TIL]20241115 소프트웨어에서 도메인이란?  (9) 2024.11.15
[TIL]20241113 MYVM 디자인 패턴  (3) 2024.11.13
[TIL]20241112 Depth  (0) 2024.11.12
[TIL]20241111 스파게티 코드  (0) 2024.11.11