abstract class

2023. 7. 10. 11:24·JAVA

A 클래스, B클래스는 공통되는 메서드를 가지고 있다. 즉 공통적인 기능을 가지고 있다.

 

예를 들어, 각 클래스에 해당 클래스의 인스턴스가 생성되는 시각을 기록하는 setCreateDate() 메서드가 있다고 해보자. 프로젝트 내에 있는 모든 클래스의 인스턴스가 생성될 때의 시각을 기록하도록 하고 싶다면, 나는 모든 클래스에 해당 메서드를 작성해주어야한다. 이러한 반복은 추상 클래스로 해결할 수 있다.

 

추상 클래스란 무엇일까?

abstract class

: 일반 메서드와 추상 메서드를 가진다. 일반적인 클래스와 다르게 인스턴스를 생성할 수 없다.
public abstract class BaseTimeEntity {

    private LocalDateTime createDate;
    
    public BaseTimeEntity() {
        setCreateDate();
    }

    private void setCreateDate() {
        this.createDate = LocalDateTime.now();
    }

}

BaseTimeEntity 추상 클래스는 현재 추상 메서드를 가지고 있지는 않다. 공통 메서드인 setCreateDate와 인스턴스 생성 시 시각을 기록하기 위해 생성자에서 이를 호출하도록 구현하였다.

해당 추상 클래스는 다음과 같이 활용될 수 있다.

public class ChildEntity extends BaseTimeEntity {
    private String name;

    public ChildEntity(String name) {
        super(); // 생략 가능
        this.name = name;
    }

    // 기타 메소드
}

 

ChildEntity가 생성될 때, BaseTimeEntity를 상속받음으로써 반복적으로 작성되어야 했던 setCreateDate 메소드를 이제는 작성하지 않아도 된다. 

 

그런데 한 가지 떠오르는 의문이 있다.

추상 클래스가 아닌 일반 클래스를 상속받아서 사용해도
반복을 해결할 수 있잖아?

 

추상 클래스 개념이 존재하는 이유는 다음과 같다.

 

  1. 추상 클래스는 일반 클래스와 다르게 인스턴스를 생성할 수 없다는 제약 조건이 있다.
  2. 추상 메서드를 선언할 수 있다. 추상 메서드는 메서드 body 부분을 생략하고 선언하며, 추상 메서드가 선언된 추상 클래스를 상속받는 클래스는 추상 메서드를 반드시 구현해야만 한다.

 

인스턴스 생성 불가


추상 클래스의 인스턴스를 생성할 수 없다는 것은 '이 클래스는 단독으로는 의미가 없다'고 알려주는 것과 같다. BaseTimeEntity 역시, 혼자서는 의미가 없다.

 

추상 메서드의 존재


추상 메서드는 public abstract void createdTime(); 과 같이 접근 제어자, 반환 타입, 메소드명의 형태를 가진다. (유의점으로, abstract는 생략 불가하다.)

이러한 추상메서드가 있는 추상 클래스를 상속받는 클래스는 추상 메서드를 반드시 구현해야 한다.

 

추상 클래스에는 example1() 일반 메서드를 구현해놓고, example2() 를 추상 메서드로 선언해놓으면 A 클래스와 B클래스는 추상 클래스를 상속받음으로써 중복 코드를 줄이고, example2()메서드의 구현을 강제할 수 있다.

 

DIY키트의 경우, 기본적인 부품은 완성되어 제공된다. 그 외 나머지 부품은 고객이 완성할 수 있도록 설계도를 제시해주고는 한다. 마치 추상 메서드처럼 말이다.
추상클래스도 이와 비슷한 느낌으로 이해하면 좋다. DIY 키트를 보면 단독으로는 의미가 없으며, 키트를 이용하여 자신만의 제품을 완성해야 한다. 추상클래스 역시도 단독으로는 인스턴스를 생성할 수 없으며, 이를 상속받아 활용하는 용도로 사용된다.

DIY 키트에서 완성되어 제공되는 기본 부품은 다른 부품으로 대체될 수 있을까? 만약 기존 부품의 '역할'을 동일하게 수행하는 부품이라면 괜찮을 것이다. 추상 클래스를 상속받은 클래스는 추상클래스의 일반 메서드를 오버라이딩하여 재구현할 수 있다.

 

추상 메서드는 유용하다. 역할만 명시해두고, 구현은 이를 상속받은 클래스에게 맡기는 일은 생각보다 잦지 않은가? 따라서 이렇게, 추상 메서드를 통하여 역할들을 정의하는 역할을 가진 개념인 인터페이스가 등장하였다.

 

추상 클래스의 추상 메서드는 abstract 키워드를 생략할 수 없는 반면 인터페이스는 abstract 키워드를 생략하고 다음과 같이 추상 메서드를 선언할 수 있다.

public interface Developer {
    void code(); // public abstract 생략
    void reviewCode(); // public abstract 생략
}

 

참고로 인터페이스의 멤버변수는 모두 public final static 이다. 인터페이스는 추상 클래스와 다르게 extends가 아니라 implements 를 사용하여 사용된다. 

 

추상 클래스와 인터페이스의 차이점에 대해 잘 설명된 글이 있어 가져왔다.

https://www.inflearn.com/questions/236439/interface%EC%99%80-abstract-class-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

Interface와 Abstract class 의 차이점 - 인프런

안녕하세요, 강의 잘 듣고 있습니다. 강의에서 이끌어 주시는대로 따라가다가 생각을 해봤습니다. - ControllerV1 은 추상적 형태이고, MemberFormControllerV1. MemberSaveControllerV1, MemberListControllerV1 는...

www.inflearn.com

 

추상 클래스와 인터페이스의 차이점은 그 목적이라고 할 수 있습니다. 추상 클래스는 기본적으로 클래스 이며 이를 상속, 확장하여 사용하기 위한 것입니다. 반면 인터페이스는 해당 인터페이스를 구현한 객체들에 대한 동일한 사용방법과 동작을 보장하기 위해 사용합니다.

 

 

JAVA 8 이후로 인터페이스에 기능이 추가되었다. 추가된 기능을 포함한 예시코드를 올려둔다.

 

interface OnlineLecture {

    // private 메서드 (Java 9 이후)
    private void play(int lectureCode) {
        System.out.println("Playing lecture: " + lectureCode);
    }

    // 디폴트 메서드 (Java 8 이후)
    default void startLecture(int lectureCode) {
        play(lectureCode); // 프라이빗 메서드 호출
    }

    // 기존
    void stop(); 
}

 

public class ETOOS implements OnlineLecture {
    @Override
    public void stop() {
        System.out.println("멈춰!");
    }

    @Override
    public void startLecture(int lectureCode) {
        OnlineLecture.super.startLecture(lectureCode);
    }
}

 

  • 추가된 기능에 대한 gpt의 설명
  • 프라이빗 메서드를 추가함으로써 디폴트 메서드나 정적 메서드가 사용하는 공통 코드를 캡슐화하고 외부에서 수정하거나 오버라이드하지 못하도록 보장할 수 있습니다. 이를 통해 의도를 명확히 하고 코드의 안정성을 높일 수 있습니다.
  • 예를 들어, play 메서드를 프라이빗으로 선언하면 이 메서드는 인터페이스 내부에서만 사용되며 외부에서 직접 접근하거나 오버라이드할 수 없게 되어, 해당 메서드의 구현을 안전하게 유지할 수 있습니다.

 

 

 

'JAVA' 카테고리의 다른 글

변수  (0) 2024.11.12
오버라이딩  (0) 2024.07.03
JVM  (0) 2024.01.02
Optional  (0) 2023.08.03
'JAVA' 카테고리의 다른 글
  • 변수
  • 오버라이딩
  • JVM
  • Optional
용쓰개
용쓰개
  • 용쓰개
    용쓰게
    용쓰개
  • 전체
    오늘
    어제
    • 분류 전체보기 (34)
      • Spring (11)
        • 스프링 Data JPA (0)
        • 스프링 시큐리티 (1)
        • QueryDSL (1)
        • webflux (1)
      • JAVA (5)
      • 여러가지 모르는 지식들 (6)
      • 알고리즘 (0)
      • 후기 (0)
        • 일상 (1)
        • 책 (1)
      • 운영체제 (1)
      • 트러블슈팅 (9)
      • 프로젝트 (0)
        • 펫동네 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
용쓰개
abstract class
상단으로

티스토리툴바