[Java] 추상클래스(Abstract class)와 인터페이스(Interface)

2024. 10. 16. 22:02·☕ Java

추상 클래스와 인터페이스에 대한 이해

Java에서 객체지향 프로그래밍을 이해하는 데 있어 중요한 개념인 추상 클래스와 인터페이스에 대해 알아보겠습니다. 이 두 개념은 코드의 재사용성과 유연성을 높이고, 모듈화된 설계를 가능하게 합니다. 각 개념을 자세히 살펴보겠습니다.

추상 클래스 (Abstract Class)

추상 클래스란?

추상 클래스는 abstract 키워드로 선언된 클래스로, 객체를 직접 생성하기 위한 것이 아니라 상속을 통해 재사용 가능한 슈퍼 클래스를 만들기 위한 것입니다. 추상 클래스는 추상 메소드를 한 개 이상 포함하거나, 직접적인 인스턴스를 생성할 수 없게 하여 상속을 강제하는 역할을 합니다.

추상 메소드란?

추상 메소드는 abstract 키워드와 함께 선언되며, 메소드의 원형만 존재하고 구현은 없습니다. 즉, 해당 메소드가 무엇을 해야 할지는 정해져 있지만, 어떻게 할지는 서브 클래스가 결정하도록 합니다.

abstract public String getName();

위의 코드처럼, 추상 메소드는 메소드 바디가 없으며, 서브 클래스가 반드시 이 메소드를 구현해야 합니다.

추상 클래스의 예시

abstract class Shape { // 추상 클래스 선언
    public Shape() { /* 생성자 */ }
    public void edit() { /* 구현된 메소드 */ }
    abstract public void draw(); // 추상 메소드 선언
}

위의 Shape 클래스는 추상 클래스이며, draw()라는 추상 메소드를 포함하고 있습니다. 따라서 이 클래스를 상속받는 서브 클래스는 draw() 메소드를 반드시 구현해야 합니다.

추상 클래스의 특징

  • 추상 클래스의 인스턴스는 생성할 수 없습니다. 이유는 추상 메소드가 미완성 상태이기 때문입니다.
  • 서브 클래스가 추상 클래스를 상속받을 경우, 해당 서브 클래스도 추상 클래스가 되거나 모든 추상 메소드를 오버라이딩하여 구현해야 합니다.

추상 클래스의 목적

  • 상속을 위한 슈퍼 클래스로 사용됩니다.
  • 서브 클래스가 반드시 구현해야 하는 메소드를 추상 메소드로 정의하여 인터페이스 역할을 합니다.
  • 다형성을 실현할 수 있습니다.

인터페이스 (Interface)

인터페이스란?

인터페이스는 클래스의 일종으로, 서로 다른 하드웨어나 소프트웨어 간의 규격을 정의한 것입니다. Java에서 인터페이스는 소프트웨어 모듈의 규격화를 통해 모듈화된 설계를 가능하게 합니다.

인터페이스 선언

인터페이스는 interface 키워드를 사용해 선언합니다. 인터페이스 안에는 상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드 등이 포함될 수 있습니다.

interface PhoneInterface {
    int TIMEOUT = 10000; // 상수 필드
    void sendCall();  // 추상 메소드
    void receiveCall(); // 추상 메소드
    default void printLog() { // 디폴트 메소드
        System.out.println("** phone **");
    }
}
  • 상수 필드: public static final 키워드가 생략되어도 상수로 취급됩니다.
  • 추상 메소드: public abstract가 생략되어도 추상 메소드로 취급됩니다.
  • 디폴트 메소드: 인터페이스에서 구현할 수 있는 메소드로, default 키워드를 사용합니다.

인터페이스의 특징

  • 객체 생성 불가: 추상 메소드가 있기 때문에 인터페이스의 인스턴스를 생성할 수 없습니다.
  • 다중 상속 가능: 인터페이스는 여러 인터페이스를 extends 키워드를 사용해 다중 상속할 수 있습니다.
  • 구현 클래스: 인터페이스를 구현하는 클래스는 implements 키워드를 사용하여 인터페이스의 모든 추상 메소드를 구현해야 합니다.

인터페이스 상속과 구현 예시

interface Phone extends PhoneInterface, MP3Interface { }

class SmartPhone implements PhoneInterface {
    @Override
    public void sendCall() {
        System.out.println("Calling...");
    }

    @Override
    public void receiveCall() {
        System.out.println("Receiving a call...");
    }
}

위 예시에서 Phone 인터페이스는 두 개의 인터페이스를 상속받으며, SmartPhone 클래스는 PhoneInterface를 구현하여 모든 추상 메소드를 정의하고 있습니다.

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

구분 추상 클래스 인터페이스
키워드 abstract class interface
멤버 필드, 메소드, 추상 메소드 포함 가능 상수, 추상 메소드, 디폴트/정적 메소드
상속 단일 상속 (다중 상속 불가) 다중 상속 가능
인스턴스 생성 불가능 불가능
목적 상속을 통해 코드 재사용 및 다형성 구현 모듈 간 규격화 및 다중 구현 가능

마무리

추상 클래스와 인터페이스는 각각 다른 목적을 가지고 있지만, 둘 다 객체지향 프로그래밍의 중요한 요소로, 코드의 재사용성, 유지보수성, 다형성 등의 이점을 제공합니다. 추상 클래스는 상속을 통한 기능 공유에, 인터페이스는 구현의 강제화와 다중 상속을 통해 보다 유연한 설계를 가능하게 합니다.


참조 📜: 명품 JAVA ESSENTIAL - 황기태 지음

'☕ Java' 카테고리의 다른 글

[Java] 메모리 영역  (1) 2024.10.16
[Java] 클래스에 대한 캐스팅(Casting)과 오버라이딩(Overriding)  (0) 2024.10.16
[Java] Thread와 Java Thread  (0) 2024.10.15
[Java] 자료형  (0) 2024.10.15
'☕ Java' 카테고리의 다른 글
  • [Java] 메모리 영역
  • [Java] 클래스에 대한 캐스팅(Casting)과 오버라이딩(Overriding)
  • [Java] Thread와 Java Thread
  • [Java] 자료형
kkongdo
kkongdo
kkongdo 님의 블로그 입니다.
  • kkongdo
    숲을 바라보며 나무를 심는 아이
    kkongdo
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • 🌏 Web (0)
      • ☕ Java (5)
      • 🌱 Spring (9)
        • Spring Boot (7)
        • Spring Data JPA & QueryDSL (2)
      • 🗂️ Database (5)
      • 💻 CS (12)
        • 운영체제 (4)
        • 네트워크 (5)
        • 자료구조 (3)
      • 🗃️Git (1)
      • 🔍 Algorithm (0)
      • 📡 DevOps (0)
        • Docker (0)
      • 🔭 ETC (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • GitHub
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JPA
    자료구조
    네트워크기기
    QueryDSL
    spring
    복잡도
    CS
    네트워크
    스케줄링
    springbatch
    db
    SpringMVC
    데이터베이스
    운영체제
    OS
    @annotation
    SpringSecurity
    조인
    java
    DI
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kkongdo
[Java] 추상클래스(Abstract class)와 인터페이스(Interface)
상단으로

티스토리툴바