본문 바로가기
JAVA/객체지향

[java/abstract] 추상의, 미완성의 abstract 클래스

by java나유 2022. 7. 3.

abstract?


 

abstract는 '미완성'이라는 의미를 가지고 있다. 메서드의 선언부만 작성하고 실제 수행 내용은 구현하지 않은 추상 메서드를 선언하는데 사용한다. 

 

abstract가 사용될 수 있는 곳 - 클래스, 메서드

abstract class AbstractTest{ //추상 클래스(추상 메서드를 포함한 클래스)
abstract void move(); //추상 메서드(구현부가 없는 메서드)
}

추상 클래스는 아직 완성되지 않은 메서드가 존재하는 '미완성 설계도'이다. 

so 인스턴스를 생성할 수 없다.

AbstractTest a = new AbstractTest(); //에러! 추상 클래스의 인스턴스 생성불가

추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.

추상클래스 - 미완성 설계도, 인스턴스 생성불가. 미완성 메서드(추상 메서드)를 포함하고 있는 클래스

추상 클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다. 새로운 클래스를 작성할 때 아무것도 없는 상태에서 시작하는 것보다는 완전하지는 못하더라도 어느 정도 틀을 갖춘 상태에서 시작하는 것이 나을 것이다.

 

추상 클래스는 'abstract'를 붙이기만 하면 된다. 이렇게 함으로써 이 클래스를 사용할 때, 클래스 선언부 abstract를 보고 이 클래스에는 추상메서드가 있으니 상속을 통해서 구현해주어야 한다는 것을 쉽게 알 수 있다.

추상 클래스는 일반 클래스와 전혀 다르지 않다. 추상 클래에서도 생성자가 있으며, 멤버변수와 메서드도 가질 수 있다.

 

 

abstract method


선언부만 작성하고 구현부는 작성 하지 않은 채로 남겨 둔 것이 추상메서드이다. 즉, 설계만 해 놓고 실제 수행될 내용은 작성하지 않았기 때문에 미완성 메서드인 것이다.

메서드를 이와 같이 미완성 상태로 남겨 놓는 이유는?

메서드의 내용이 상속받는 클래스에따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려 주고, 실제 내용은 상속 받는 클래스에서 구현하도록 비워두는 것이다.

 

추상메서드는 구현부가 없음으로 괄호{}대신 문장의 끝을 알리는 ";"을 적어준다.

abstract 리턴타입 메서드이름();

추상클래스로부터 상속받는 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해주어야 한다.

abstract class Player{ //추상클래스
abstract void play(int pos); //추상메서드
    abstract void stop(); //추상메서드
    
 class AudioPlayer extends Player{
 void play(int pos){ /*내용 생략*/ } //추상메서드 구현
    void stop(){/*내용 생략*/} //추상메서드를 구현
 
 abstract class AbstractPlayer extends Player{
 	void play(int pos){/* 내용 생략*/ } //추상메서드 구현

 

상속이 자손 클래스를 만드는데 조상 클래스를 사용하는 것이라면, 이와 반대로 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상 클래스를 만드는 것이라고 할 수 있다.

 

출처:자바의정석

728x90

댓글