Java의 추상 클래스(Abstract class), 추상 메서드(Abstract method)에 대해 간단히 정리해 보고자 합니다.
1. 추상 클래스(Abstract class)
1-1. 정의
- 추상 클래스는 추상 메서드(Abstract mehtod)를 보유하고 있는 클래스를 의미합니다.
- 추상화의 특성을 이용하고, 다른 클래스의 부모 클래스가 되기 위한 클래스이기도 하며 추상 클래스를 사용하는 근본적인 이유는, 클래스에 추상화의 개념을 접목시켜, 구조적으로 객체를 설계하고 코드의 유지보수성(수정, 추가), 확장성이 높은 프로그램을 설계할 수 있도록 하기 위함입니다.
- 여러 객체들에 대해 공통적으로 사용될 수 있는 공통 부분을 기준으로 추상 클래스를 작성합니다.
1-2. 추상 클래스(Abstract class)의 특징
(1) 추상 클래스를 선언할 때 abstract 키워드를 사용합니다.
abstract class GeneralPlayer{
abstract void play();
abstract void stop();
abstract void UpVolume();
abstract void DownVolume();
}
(2) 추상 클래스는 상속은 가능하지만, 인스턴스화(객체 생성)할 수 없습니다.
- 추상 메서드(완성되지 않은 구체적이지 않은 메서드, 구현부 미존재)를 가지고 있기 때문입니다.
- 추상 클래스는 상속 구조에서 다른 클래스의 부모 클래스임을 나타내는 역할로만 사용되기 때문입니다.
(3) 아래 코드처럼, 상속을 통해 또 다른 클래스에서 추상 메서드를 완성시켜야 객체를 생성할 수 있습니다.
class AudioPlayer extends GeneralPlayer {
void play() {/* 내용 생략 */}
void stop() {/* 내용 생략 */}
void UpVolume() {/* 내용 생략 */}
void DownVolume() {/* 내용 생략 */}
}
(4) 상속을 통해 일부 추상 메서드만 구현했다면 생성된 클래스는 추상 클래스가 됩니다.
- 상속을 통해 추상 메서드가 모두 완성되지 않았다면, 상속을 받는 클래스에 abstract를 붙입니다.
abstract class AbstractAudioPlayer extends GeneralPlayer {
void play() {/* 내용 생략 */}
void stop() {/* 내용 생략 */}
}
(5) 추상 클래스는 꼭 추상 메서드만 존재할 수 있는 것이 아니며, 인스턴스 변수, 생성자 등 다양한 요소가 존재할 수 있습니다.
1-3. 추상 클래스의 의미
- 추상 클래스는 어떤 의미에서 보면 완전히 완성되지 않은 설계도로 볼 수 있습니다.
추상 클래스는 단독으로 객체를 생성할 수 없고 자식 클래스를 통해 자신을 완성시켜줘야만 하기 때문입니다.
- 이처럼 추상 클래스는 일반적인 클래스로써의 역할을 수행할 순 없지만 다른 특정한 클래스를 새롭게 정의하는데 있어 바탕이 되는 부모(슈퍼) 클래스로써의 의미를 갖게 됩니다.
2. 추상 메서드(Abstract method)
2-1. 정의
- 완성되지 않은 메서드를 의미하며, 구현부가 존재하지 않는 메서드입니다.
- 문법 : abstract 반환 타입 메서드명();
2-2. 추상 메서드(Abstract method)의 특징
(1) 추상 메서드는 어떤 클래스가 상속을 받아 자신이 구현되기 전까지 추상 메서드를 호출할 수 없습니다.
- 하지만 클래스 상속을 통해 추상 메서드가 구현된다면, 해당 메서드를 호출할 수 있게 됩니다.
(2) 위와 같은 특징으로 추상 클래스 내부에서 추상 메서드를 호출할 수 있습니다
3. 추상 클래스에서의 다형성
- 아래에서 보는 것처럼 자식 클래스 타입의 참조변수로 객체를 물론 생성하였지만, 부모 타입의 참조변수로도 객체를 생성할 수 있게 됩니다.
- 이를 통해 추상 클래스에서도 다형성(부모 타입의 참조변수로 자식 타입의 객체를 다룰 수 있는 것)이 존재한다는 것을 알 수 있습니다.
package oop_second;
abstract class GeneralPlayer{
abstract void play();
abstract void stop();
}
// 완전히 구현된 AudioPlayer 클래스
class AudioPlayer extends GeneralPlayer {
void play() { System.out.println("재생 시작"); }
void stop() { System.out.println("재생 멈춤"); }
}
public class AbstractClass {
public static void main(String[] args) {
// 자식 클래스의 참조변수로 객체 생성 가능
AudioPlayer ap1 = new AudioPlayer();
// 다형성 : 부모의 참조변수로도 자식 객체를 다룰 수 있게 된다.
GeneralPlayer ap2 = new AudioPlayer();
}
}
======================================================================
해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.
개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있습니다.
이에 대해 지적해 주시면 감사하겠습니다.
'백엔드(Back-End) > Java' 카테고리의 다른 글
[Java] - 자바 가상 머신, JVM(Java Virtual Machine) (0) | 2023.10.19 |
---|---|
[Java] - 자바 빌드 도구 Maven, Gradle 정리 (0) | 2023.10.19 |
[Java] - 제어자, 접근 제어자, 캡슐화, 다형성 (0) | 2023.01.10 |
[Java] - 클래스의 상속, 메서드 오버라이딩, 참조변수 super, 생성자 super(), 패키지와 import 문 (0) | 2023.01.10 |
[Java] - 메서드 오버로딩, 참조변수 this, 생성자 this(), 멤버 변수의 초기화 (0) | 2023.01.10 |
댓글