java

추상 클래스(abstract class) vs 인터페이스(interface)

윤밥밥 2024. 10. 4. 02:13

목차


1. 추상 클래스란?

2. 인터페이스란?

3.언제 추상 클래스를 사용하고, 언제 인터페이스를 사용해야 할까?

 

 


추상 클래스란?


추상 클래스(abstract class): 공통된 속성이나 메서드를 포함한 클래스. 일부 메서드는 구현할 수 있고, 다른 메서드는 추상 메서드로 선언하여 하위 클래스에서 반드시 구현하도록 강제한다.

  • 단일 상속만 지원한다.
  • 추상 클래스는 객체를 직접 생성할 수는 없으나, 생성자를 가질 수 있고 하위 클래스에서 생성자를 통해 상위 클래스의 필드를 초기화 할 수 있다.

예시

1.추상 클래스

public abstract class myAbstractClass { // abstract를 통해 추상 클래스임을 명시

    public static int myField = 5; // 추상클래스는 초기화된 필드를 가질 수 있다.

    public int myField2; // 추상클래스는 초기화되지 않은 필드도 가질 수 있다.(생성자에서 초기화)

    public abstract void abstractMethod(); //abstact를 명시해 추상 클래스(구현되지 않은 클래스)를 가질 수 있다.

    public void concreteMethod() { // 추상 클래스는 구현된 메서드를 가질 수 있다.
        System.out.println("concreteMethod");
    }

    public myAbstractClass(int myField2) { // 생성자를 가질 수 있다.
        this.myField2 = myField2;
    }
}

 

추상 클래스 선언

public abstract class myAbstractClass {

  • abstract 키워드가 붙은 클래스는 추상 클래스이다. 추상 클래스는 객체를 직접 생성할 수 없으며, 반드시 상속을 통해 하위 클래스에서 사용되어야 한다.

정적 필드(static 필드)

public static int myField = 5;

  • 추상 클래스도 정적 필드를 가질 수 있으며, 이는 객체를 생성하지 않고도 접근할 수 있다.

인스턴스 필드

public int myField2;

  • 이 변수는 생성자에서 초기화되며, 클래스가 객체로 생성된 후에 각 객체마다 고유한 값을 가질 수 있다.

추상 메서드

public abstract void abstractMethod();

  • abstract 메서드는 구현되지 않은 메서드로, 추상 클래스 내에서 선언만 하고 구체적인 구현을 하지 않는다.

구현된 메서드

public void concreteMethod() {
    System.out.println("concreteMethod");
}
  • 추상 클래스는 구현된 메서드를 포함할 수 있다. 하위 클래스에서 재정의할 필요 없이 바로 사용할 수 있다.

생성자

public myAbstractClass(int myField2) {
    this.myField2 = myField2;
}
  • 추상 클래스도 생성자를 가질 수 있다. 추상 클래스의 생성자는 하위 클래스에서 호출되어야 하며, 주로 필드 초기화 등의 작업을 수행한다.

 

2. 자식 클래스

public class ChildClass extends myAbstractClass { // extends로 상속받을 수 있다.

    public ChildClass(int myField2) { //부모 클래스의 생성자를 super를 통해 인스턴스화 한다.
        super(myField2);
    }

    @Override //override를 통해 추상 메서드를 구현할 수 있다.
    public void abstractMethod() {
        System.out.println("abstractMethod");
    }
}

 

추상 클래스 상속

public class ChildClass extends myAbstractClass {

  • extends 는 부모 클래스를 상속받는 다는 뜻이다.

생성자에서 super() 호출

super(myField2);

  • 생성자에서 super(myField2)부모 클래스의 생성자를 호출하는 역할을 한다.

추상 메서드 구현

@Override
public void abstractMethod() {
    System.out.println("abstractMethod");
}
  • myAbstractClass에서 선언된 추상 메서드 abstractMethod()는 구현되지 않았기 때문에, 이를 하위 클래스인 ChildClass에서 반드시 구현해야 한다.

 

3. 다중상속 불가

  • 위처럼 2개 이상의 클래스를 상속받으려 하면 에러가 발생한다.

 

인터페이스란?


인터페이스(interface): 클래스가 구현해야 할 메서드 집합만을 선언한다. 메서드 선언부는 있으나, 구현부는 없다. 따라서 구현 클래스는 모든 메서드를 반드시 구현해야 한다.

  • 다중 구현이 가능하다.
  • 필드를 가질 수는 없으나, 상수(static final)는 사용할수 있다.
  • 생성자를 가질 수 없다.
  • 자바 8부터 디폴트 메서드가 추가되어, 인터페이스 내에 구현된 메서드를 가질 수 있게 되었다.

예시

1. 인터페이스

public interface MyInterface { // interface를 명시하여 인터페이스임을 알린다.

    int method(); // 구현되지 않는 메서드만을 가진다. {}를 넣으면 구현된 것으로 간주하므로, 넣지 않는다.

    default int method2() { // defalut 메서드로 구현된 메서드를 가질 수 있다.
        return 0;
    }
}

 

인터페이스 선언

public interface MyInterface {

  • interface 키워드는 인터페이스를 선언할 때 사용된다.
  • 인터페이스는 객체를 직접 생성할 수 없고, 여러 클래스를 설계할 때 공통된 동작을 강제하기 위해 사용된다.

구현되지 않은 메서드

int method();

  • 인터페이스의 메서드는 구체적인 구현을 포함하지 않는다.
  • {}이 없음을 통해 추상 메서드임을 알 수 있다.

디폴트 메서드

default int method2() {
    return 0;
}
  • default 키워드를 사용하여 메서드의 기본 구현을 제공하며, 구현하는 클래스가 이 메서드를 재정의할 수도 있다.

 

2. 구현 클래스

public class MyClass implements MyInterface {

    @Override
    public int method() {
        return method2();
    }
}

 

인터페이스 상속

public class MyClass implements MyInterface {

  • implements를 통해 인터페이스를 상속받을 수 있다.

메서드 구현

    @Override
    public int method() {
        return method2();
    }
  • @Override를 통해, 인터페이스의 메서드를 구현할 수 있다.

 

3. 다중상속 가능


 

언제 추상 클래스를 사용하고, 언제 인터페이스를 사용해야 할까?

추상 클래스

  • 공통된 동작과 상태를 정의 할 때
  • 필드를 포함해야 하는 경우
  • 기본 동작을 제공하고, 일부만 구현하도록 강제할 때

인터페이스

  • 다중 상속이 필요할 경우
  • 좀 더 강력한 추상화를 가져가고 싶을 때
  • 다양한 클래스에 공통된 동작을 강제하고 싶을 떄