JAVA

[JAVA]추상클래스와 인터페이스

당고개 2023. 10. 25. 22:38

1. abstract 클래스

abstract 클래스는 추상 클래스라고도 불리며, 추상화를 좀 더 구조적으로 도와주는 도구입니다.

public abstract class Dog {
    protected String name;

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

    public abstract void bite();

    public abstract void bark();

    protected void eat() {
        System.out.println("먹는다");
    }
}

추상 클래스를 만들기 위해서는 class 앞에 abstract 키워드를 사용하여 추상 클래스라는 것을 명시합니다.

추상 클래스

abstract class 클래스명

이러한 추상 클래스는 추상화 할 수 있는 몇 가지 도구를 제공합니다.

추상 메서드

abstract void bite();

abstract void bark();

abstract 메서드는 메서드의 이름과 반환형, 매개 변수만 선언하고 내용에 대해서는 정의하지 않습니다. 내용에 대한 정의는 확장 (extends) 하는 클래스에 위임하고 있습니다.

public class Retriever extends Dog {

    public Retriever(String name) {
        super(name);
    }

    // 반드시 추상 메서드는 Override 해야 한다.
    public void bite() {
        …
    }

    // 반드시 추상 메서드는 Override 해야 한다.
    public void bark() {
        …
    }

}

abstract 메서드는 내용이 정의되어 있지 않기 때문에 확장하는 클래스에서 abstract 메서드를 반드시 Override 해야 합니다.

abstract 클래스의 특징

abstract 클래스의 특징을 정리하면 다음과 같습니다.

  • 생성자를 정의할 수 있습니다.
  • 단독으로 인스턴스를 생성할 수 없습니다.(확장해야지 사용 가능하다)
  • 추상 메서드를 사용 시 abstract 키워드가 선언되어 있어야 합니다.
  • abstract 메서드는 확장하는 클래스에서 내용을 정의해야 하므로 private 지시자를 선언할 수 없습니다.
  • 확장하는 클래스는 abstract 메서드를 반드시 override 해야 하며 구현체가 존재해야 합니다.

2. interface

interfaceabstract 클래스와 동일하게, 추상화를 좀 더 구조적으로 도와주는 도구입니다. 그리고 현업에서 abstract 클래스보다 훨씬 많이 사용됩니다. 그러므로 interface에 대해서 잘 알아야 합니다.

public interface Dog {
    public static final String color = "검정";

    public abstract void bite();

    public abstract void bark();

    public default void eat() {
        System.out.println("먹는다");
    }

    public static String getColor() {
         return color;
    }
}

인터페이스를 만들기 위해서는 interface 키워드를 사용하여 인터페이스라는 것을 명시합니다.

인터페이스

interface 인터페이스명

인터페이스 또한 추상 클래스와 같이 abstract 메서드를 제공합니다.

추상 메서드

public abstract void bite();

public abstract void bark();

abstract 메서드는 메서드의 이름과 반환형, 매개 변수만 선언하고 내용에 대해서는 정의하지 않습니다. 내용에 대한 정의는 구현(implements)하는 클래스에 위임하고 있습니다.

다만 인터페이스 내의 추상 메서드는 모두 public abstract 의미를 내포하기 때문에 생략해도 상관없습니다.

public static final String color = "검정";

인터페이스 내에 선언하는 변수는 모두 public static final이어야 합니다.
또한 public static final을 생략하더라도 모든 변수는 public static final 변수가 됩니다.

public class Retriever implements Dog {

    public Retriever(String name) {
        super(name);
    }

    // 반드시 추상 메서드는 Override 해야 한다.
    public void bite() {
        …
    }

    // 반드시 추상 메서드는 Override 해야 한다.
    public void bark() {
        …
    }

}

추상 클래스의 abstract 메서드와 동일하게 abstract 메서드는 내용이 정의되어 있지 않기 때문에 인터페이스의 내용에 대한 정의는 구현(implements)하는 클래스에 위임하므로 추상 메서드를 반드시 override 해야 합니다.

public interface Dog {

    // 인터페이스는 생성자를 선언 및 정의를 할 수 없다.
    public Dog(String name) { 
        this.name = name;
    }
}

 

인터페이스는 생성자를 선언 및 정의할 수 없습니다. 인터페이스는 확장(extends)을 위해 사용하기 보다는 메서드 규약(protocol)을 위해 사용하는 경우가 많기 때문에 생성자를 선언할 수 없습니다.

interface의 특징

  • 생성자를 선언 및 정의할 수 없습니다.
  • 인터페이스 내에서 선언하는 변수는 모두 public static final이 선언된 변수입니다.
  • default 메서드도 아니고 static 메서드도 아닌 메서드는 모두 public abstract가 선언된 메서드입니다.(Java8 기준)
  • default 메서드나 static 메서드는 모두 public이 선언된 메서드입니다.
  • 상속받는 클래스는 abstract 메서드를 반드시 override 해야 하며 구현체가 반드시 존재해야 합니다.
  • 인터페이스의 내용을 실제로 구현하는 클래스는 인터페이스를 implements 해야 합니다.

3. abstract vs interface

추상 클래스와 인터페이스의 차이를 헷갈려 하실 수 있습니다. 사실 추상 클래스는 현업에서 생각보다 많이 쓰이지 않습니다. 그래도 정확히 이해하고 넘어가는 것이 가장 좋습니다.

추상 클래스와 인터페이스의 차이는 이렇게 볼 수 있습니다.

  • 생성자 정의 가능 여부
  • 변수 접근 제어 지시자 다양성 여부
  • abstract 메서드 접근제어 지시자 다양성 여부
  • default 메서드, static 메서드 접근제어 지시자 다양성 여부

사실 좀 더 자유도가 높은 것은 추상 클래스이나, 추상 클래스는 확장에 의미가 더 가깝고 인터페이스는 규약에 가깝기 때문에 인터페이스를 더 많이 사용합니다.

 

 

출처 : https://www.codelatte.io/courses/java_programming_basic/MEO3G6IOJHJVPFCP

'JAVA' 카테고리의 다른 글

[JAVA]람다 표현식  (2) 2023.10.31
[JAVA]익명 클래스  (0) 2023.10.31
[JAVA]추상화  (0) 2023.10.24
[JAVA]오버라이드(Override)  (0) 2023.10.23
[JAVA]다형성  (0) 2023.10.19