추상 클래스는 미완성된 클래스를 뜻하며, 선언되어 있지만 구현되지 않은 미완성의 메소드(추상 메소드)를 포함하고 있는 클래스일 때 astract
키워드를 class 앞에 붙여 준다.
추상클래스는 추상메소드를 포함하고 있다는 것을 제외하고는 일반 클래스와 같다.
몸통({}
)이 없는 메소드를 의미하며, 상속 시 반드시 구현해야 하는, 오버라이딩이 강제화되는 메소드이다.
abstract class Player { // 추상클래스
abstract void play(int pos); // 추상메소드
abstract void stop(); // 추상메소드
}
class AudioPlayer extends Player { // AudioPlayer : 완성된설계도 / Player : 미완성설계도
void play(int pos) { ... } // 추상메소드를 구현
void stop() { ... } // 추상메소드를 구현
}
abstract class AbstractPlayer extends Player {
void play(int pos) { ... } // 추상메소드를 구현
}
AudioPlayer ap = new AudioPlayer(); // OK
Player p = new AudioPlayer(); // OK
여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고, 기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 하는 경우도 있다.
💡 추상화 - 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업 구체화 - 상속을 통해 클래스를 구현, 확장하는 작업package inherit.sample;
public abstract class Person {
private String name;
public Person() {
super();
}
public Person(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void out();
}
package inherit.sample;
public class Student extends Person {
private String subject;
public Student() {
super();
}
public Student(String subject) {
super();
this.subject = subject;
}
public Student(String name, String subject) {
super(name);
this.subject = subject;
}
@Override
public void out() { // 상속받은 부모의 추상메소드는 반드시 오버라이딩 해야 함.
System.out.println(getName() + " 학생입니다.");
System.out.println(subject + "를 수강합니다.");
}
}
package inherit.sample;
public class Professor extends Person {
private String major;
public Professor() {
super();
}
public Professor(String major) {
super();
this.major = major;
}
public Professor(String name, String major) {
super(name);
this.major = major;
}
@Override
public void out() {
System.out.println(getName() + " 교수입니다.");
System.out.println(major + "를 전공합니다.");
}
}
package inherit.test;
import inherit.sample.Professor;
import inherit.sample.Student;
public class AbstractEx {
public static void main(String[] args) {
Student stu = new Student("홍길동", "자바");
Professor prof = new Professor("김춘추", "컴퓨터과학");
stu.out();
prof.out();
}
}
// 실행 결과
홍길동 학생입니다.
자바를 수강합니다.
김춘추 교수입니다.
컴퓨터과학를 전공합니다.