Java 추상클래스(abstract class)

추상 클래스

추상 클래스는 미완성된 클래스를 뜻하며, 선언되어 있지만 구현되지 않은 미완성의 메소드(추상 메소드)를 포함하고 있는 클래스일 때 astract 키워드를 class 앞에 붙여 준다.

💡 public abstract class 클래스이름 { // 필드, 생성자, 메소드 작성 // 미완성된 추상 메소드 선언 }

추상클래스는 추상메소드를 포함하고 있다는 것을 제외하고는 일반 클래스와 같다.

특징

  • 미완성 클래스(abstract 키워드 사용)
    자체적으로 객체 생성 불가 → 반드시 상속하여 객체 생성
  • abstract 메소드가 포함된 클래스는 반드시 abstract 클래스
    abstract 메소드가 없어도 abstract 클래스 선언 가능
  • 클래스 내에 일반 변수, 메소드 포함 가능
  • 객체 생성은 안되지만 참조형 변수 타입으로는 사용 가능

장점

  • 일관된 인터페이스 제공
  • 꼭 필요한 기능 강제화(공통적이나 자식클래스에서 특수화 되는 기능)

추상 메소드

몸통({})이 없는 메소드를 의미하며, 상속 시 반드시 구현해야 하는, 오버라이딩이 강제화되는 메소드이다.

💡 [접근제한자] abstract 리턴타입 함수이름(); // 몸통{}이 없다!
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();
	}
}

// 실행 결과
홍길동 학생입니다.
자바를 수강합니다.
김춘추 교수입니다.
컴퓨터과학를 전공합니다.

좋은 웹페이지 즐겨찾기