abstract class 클래스 이름{ .... }
🔸 미완성 메서드(추상메서드)를 포함하고 있는 클래스로, 상속받은 자손클래스에서 구현함으로써 완성시킬 수 있다.
🔸 클래스로서의 역할은 못하지만, 틀의 역할을 함으로써 새로운 클래스를 작성할 때 바탕이 된다.
🔸 상속받은 자손클래스가 추상클래스가 포함하고 있는 추상메서드들의 구현을 강제하기 위함이다.
(일반클래스로 구현하게되면 메서드들을 구현해도 되고 안해도 되지만, 추상클래스는 반드시 구현해 주어야 한다.)
🔸 추상메서드에 abstract를 사용하는 이유 : abstract없이 빈 구현부{}만 가지고 있다면, 상속하는 자손클래스에서는 메서드가 완전하게 구현된 것으로 인식하고 구현하지 않을 수도 있기 때문이다.
🔸 선언부만 작성하고 구현부는 작성하지 않은 메서드(=미완성 메서드)
➡️ 메서드의 내용이 상속받는 자손클래스마다 달라질 수 있기 때문에 선언부만 작성하고 주석을 통해 메서드의 목적과 기능에 대해서 설명해준다.abstract class Player{ abstract 리턴타입 메서드이름(); abstract void play(int pos); abstract void stop(); }
🔸 사실상 선언부가 구현부보다 중요하다.
➡️ 메서드 이름, 필요한 매개변수, 반환타입만 결정되어있다면 사용하는 사람이 구현하는 것은 그리 어렵지 않다.
🔸 작성방법
1. 여러 클래스에 공통적으로 사용될 수 있는 부분을 추상클래스에 바로 작성.
2. 작성된 여러 클래스들에서 공통적인 부분을 뽑아 추상클래스로 만든 후, 기존클래스에서 상속하도록 함.🔸 추상화 ↔️ 구체화
- 추상화 : 클래스들의 공통된 부분을 찾아 조상클래스를 만드는 작업
- 구체화 : 상속을 통해서 자손클래스를 구현, 확장하는 작업
‼️ 상속계층도를 따라 올라갈 수록 추상화의 정도는 심해지고, 내려갈 수록 기능이 추가되고 구체화의 정도가 심해진다.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 attack(){ /* 공격하기 구현 */ }; }