추상클래스와 인터페이스

이진수·2024년 1월 24일
0

추상 클래스와 인터페이스의 차이점과 그 사용 목적을 정확히 하고자 이번 글을 포스팅하게 되었다.


1. 추상 메서드(abstract method)

부모 클래스를 상속 받는 자식 클래스가 반드시 오버라이딩 해야 하는 메서드를 부모 클래스에 정의할 수 있다. 이것을 추상 메서드라 하는데 이름 그대로 추상적인 개념을 제공하는 메서드이다. 실체가 존재하지 않고, 메서드 바디가 없다.

// 추상 메서드 예시
public abstract void testMethod();
  • 추상 메서드는 선언할 때 메서드 앞에 추상이라는 의미의 abstract 키워드를 붙여준다.
  • 추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야 한다.
    • 추상 메서드는 메서드 바디가 없으므로 작동하지 않는 불완전한 클래스로 볼 수 있다.
    • 따라서 직접 생성하지 못하도록 추상 클래스로 선언해야 한다.
  • 상속 받는 자식 클래스가 반드시 오버라이딩 해서 사용해야 한다.
    • 오버라이딩 하지 않으면 자식도 추상 클래스가 되어야 한다.

2. 추상 클래스(abstract class)

class 앞에 'abstract' 키워드를 사용해 정의하며, 하나 이상의 추상 메서드를 가지는 클래스를 의미한다. 추상 메서드를 선언하여 상속을 통해 하위 클래스에서 반드시 구현하도록 제약을 가한다.

// 추상 클래스 예시
public abstract class AbstractClass { ... }
  • extends 키워드를 사용해 상속하며, 다중 상속이 불가능하다.
  • new 연산자를 사용해 직접 인스턴스를 생성하지 못하도록 제약이 추가된 것이다.

📖 추상 클래스&메서드 사용 예시

public abstract class AbstractAnimal {
   public abstract void sound();

   public void move() {
       System.out.println("동물이 움직입니다.");
   }
}

class Dog extends AbstractAnimal {

   @Override
   public void sound() {
       System.out.println("멍멍");
   }
}

move() 메서드는 추상 메서드로 선언되지 않았으므로 자식 클래스에서 강제로 구현하지 않아도 상관없다.


3. 인터페이스(Interface)

interface 키워드를 사용하여 선언하는 인터페이스는 상수(static final)와 추상 메서드의 집합이다.
추상 클래스보다 추상화 정도가 높고, 추상 클래스와는 다르게 구현부가 있는 일반 메서드, 일반 멤버 변수를 가질 수 없다는 특징이 있다.

// 인터페이스 예시
public interface MyInterface {
    
    int MAX_VALUE = 100;
    String DEFAULT = "Hello";
    
    void myMethod();
    int calculate(int x, int y);
}

class MyClass implements MyInterface {
    
    @Override
    public void myMethod() {
        System.out.println("myMethod 구현");
    }
    
    @Override
    public int calculate(int x, int y) {
        return x + y;
    }
}
  • 인터페이스의 모든 멤버 변수는 public static final 이어야 하며, 생략이 권장된다.
  • 인터페이스의 모든 메서드는 public abstract 이어야 하며, 생략이 권장된다.
  • 부모 자식 관계인 상속에 얽매이지 않고, 공통 기능이 필요할 때마다 추상 메서드를 정의하고 구현하는 방식으로 추상클래스보다 자유롭게 사용 가능

4.인터페이스 vs 추상클래스

  • 인터페이스: 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞기 기능을 구현(implements)

  • 추상클래스: 자신의 기능들을 하위 클래스로 확장 시킴(extends)


< 추상클래스를 사용하는 경우 >

  1. 상속 받을 클래스들이 공통으로 가지는 메서드와 필드가 많아 중복 멤버 통합을 할 때
  2. 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며, 그 기능을 구현해야 할 경우

< 인터페이스를 사용하는 경우 >

  1. 서로 연관성이 없는 클래스들을 묶어 주고 싶을 때
  2. 다중 구현을 통한 추상화 설계
  3. 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장
이미지
profile
기록하는 개발자🧑🏻‍💻

0개의 댓글