[Java] 추상 클래스

szlee·2023년 12월 14일
0

Java

목록 보기
21/23

< 김영한의 실전 자바 - 기본편 > 강의를 보고 이해한 내용을 바탕으로 합니다.





추상 클래스

동물(Animal)과 같이 부모 클래스는 제공하지만, 실제 생성되면 안되는 클래스를 추상 클래스라 한다.
추상 클래스는 이름 그대로 추상적인 개념을 제공하는 클래스이다. 따라서 실체인 인스턴스가 존재하지 않는다. 대신에 상속을 목적으로 사용되고, 부모 클래스 역할을 담당한다.

abstract class AbstractAnimal {...}
  • 추상 클래스는 클래스를 선언할 때 앞에 추상이라는 의미의 abstract 키워드를 붙여주면 된다.
  • 추상 클래스는 기존 클래스와 완전히 같다. 다만 new AbstractAnimal()과 같이 ⭐️직접 인스턴스를 생성하지 못하는 제약이 추가된 것이다.⭐️



추상 메서드

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

public abstract void sound();
  • 추상 메서드는 선언할 때 메서드 앞에 추상이라는 의미의 abstract키워드를 붙여주면 된다.
  • 추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야 한다.
    • 그렇지 않으면 compile error. Abstract method in non-abstract class
    • 추상 메서드는 메서드 바디가 없다. 따라서 작동하지 않는 메서드를 가진 불완전한 클래스이다. 따라서 직접 생성하지 못하도록 추상 클래스로 선언해야 한다.
  • 추상 메서드는 상속 받는 자식 클래스가 반드시 오버라이딩해서 사용해야 한다.
    • 그렇지 않으면 compile error.
    • 추상 메서드는 자식 클래스가 반드시 오버라이딩 해야 하기 때문에 메서드 바디 부분이 없다. 바디 부분을 만들면 compile error. Abstract methods cannot have a body
    • 오버라이딩 하지 않으면 자식도 추상 클래스가 되어야 한다.
  • 추상 메서드는 기존 메서드와 완전히 같다. 다만 메서드 바디가 없고, 자식 클래스가 해당 메서드를 반드시 오버라이딩 해야한다는 제약이 추가된 것이다.

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

    public void move(){
        System.out.println("동물이 움직입니다.");
    }
}
  • AbstractAnimalabstract가 붙은 추상 클래스이다. 이 클래스는 직접 인스턴스를 생성할 수 없다.
  • sound()abstract가 붙은 추상 메서드이다. 이 메서드는 자식이 반드시 오버라이딩 해야한다.

이 클래스는 move()라는 메서드를 가지고 있는데 이 메서드는 추상 메서드가 아니다. 따라서 자식 클래스가 오버라이딩 하지 않아도 된다.

지금까지의 제약을 제외하고 나머지는 모두 일반적인 클래스와 동일하다. 추상 클래스는 제약이 추가된 클래스일 뿐이다. 메모리 구조, 실행 결과 모두 동일하다.

[정리]

  • 추상 클래스 덕분에 실수로 Animal 인스턴스를 생성할 문제를 근본적으로 방지해준다.
  • 추상 메서드 덕분에 새로운 동물의 자식 클래스를 만들 때 실수로 sound()를 오버라이딩 하지 않을 문제를 근본적으로 방지해준다.




순수 추상 클래스 : 모든 메서드가 추상 메서드인 추상 클래스

모든 메서드가 추상 메서드인 순수 추상 클래스는 코드를 실행할 바디 부분이 전혀 없다.

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

이러한 순수 추상 클래스는 실행 로직을 전혀 가지고 있지 않다. 단지 다형성을 위한 부모 타입으로써 껍데기 역할만 제공할 뿐이다.

순수 추상 클래스는 다음과 같은 특징을 가진다.

  • 인스턴스를 생성할 수 없다.
  • 상속 시 모든 메서드를 오버라이딩 해야한다.
  • 주로 다형성을 위해 사용된다.

상속하는 클래스는 모든 메서드를 구현해야 한다.
"상속 시 자식은 모든 메서드를 오버라이딩 해야한다."라는 특징은 상속 받는 클래스 입장에서 보면 부모의 모든 메서드를 구현해야 하는 것이다.
이런 특징을 잘 생각해보면 순수 추상 클래스는 부모의 기능을 물려받기 보다는 마치 어떤 규격을 지켜서 구현해야하는 것처럼 느껴진다.
AbstractAnimal의 경우 sound(), move()라는 규격에 맞추어 구현을 해야 한다.

=> 일반적으로 이야기하는 인터페이스와 같이 느껴진다.🤔

예를 들어 USB 인터페이스를 생각해보자.
USB 인터페이스는 분명한 규격이 있다. 이 규격에 맞추어 제품을 개발해야 연결이 된다. 순수 추상 클래스가 USB 인터페이스 규격이라고 한다면 USB 인터페이스에 맞추어 마우스, 키보드 같은 연결 장치들을 구현할 수 있다.

이런 순수 추상 클래스의 개념은 프로그래밍에서 매우 자주 사용된다. 자바는 순수 추상 클래스를 더 편리하게 사용할 수 있도록 인터페이스라는 개념을 제공한다.

profile
🌱

0개의 댓글