추상클래스(abstract class)

추상클래스란?

추상클래스는 미완성 설계도라고 할 수 있다. 미완성 메소드를 포함하고 있다는 뜻이다.

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

추상클래스는 그 자체로는 클래스로서의 역할을 못하지만, 이를 상속받는 자식메소드에게 어느정도의 틀을 제공한다는 것에 있어 의의가 있다.

클래스의 선언부에 abstract를 붙여주면 되고, 이는 이 클래스 내부에 추상 메소드가 존재한다는 의미이다.

추상 메소드(abstract method)

메소드는 선언부와 구현부로 구성되어있는데, 선언부만 작성하고 구현부는 작성하지 않은 메소드가 추상메소드이다.

메소드의 반환타입, 이름, 매개변수를 지정하기 때문에 중요하다고 할 수 있다.

추상클래스를 상속받는 자식클래스는 추상클래스의 모든 추상메소드를 오버라이딩해야한다.

abstract void play(int pos); 이런식으로 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){
				// ...
		}
}

추상클래스의 작성

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

추상화는 구체화와 반대되는 의미이다.

<aside> 💡 추상화 - 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업 구체화 - 상속을 통해 클래스를 구현, 확장하는 작업

</aside>

상속을 거쳐 자식으로 갈 수록 클래스는 구체화 되고, 부모클래스로 올라갈 수록 추상화가 된다.

굳이 추상 클래스로 선언하는 이유는 자식클래스에서 추상메소드를 반드시 구현하도록 강제하기 위해서이다.

abstract class Unit{
		int x, y;
		abstract void move(int x, int y);
		void stop(){ 
				// 현재위치에 정지
		}
}
class Marine extends Unit{
		void move(int x, int y) {}
		void stimPack() {}
}
class Tank extends Unit{
		void move(int x, int y) {}
		void stimPack() {}
}
class Dropship extends Unit{
		void move(int x, int y) {}
		void load() {}
		void unload() {}
}

이렇게 추상클래스인 Unit 을 정의하고 자식클래스들의 공통적인 요소인 stop()은 일반 메소드로 정의하고, 자식클래스마다 움직이는 방법이 다르기 때문에 move()는 추상클래스로 정의하여 오버라이딩으로 구현한다.