티스토리 뷰
추상 클래스
객체를 생성할 수 없는 클래스, new 연산자를 이용한 생성자 호출이 불가능하다.
- 추상메서드를 가질 수 있으나 상속받는 서브클래스에서 반드시 오버라이딩 해야한다.
(구현의 강제성을 부여해서 코드의 통일성이 향상)
- 추상메서드, 일반메서드, 생성자, 멤버변수를 가질 수 있음
- 상속으로 서브클래스에서 사용 가능, 업캐스팅으로 다형성 활용 가능
abstract method
추상 메서드.
- 메서드의 구현부가 없는 추상메서드는 실행할 코드가 없기 때문에 외부에서 호출 불가
- 추상 메서드를 갖는 클래스는 반드시 추상 클래스로 선언해야한다! (반대의 경우는 가능하다)
[접근제한자] abstract [리턴타입] 메서드명 ([매개변수...]);
public class Ex1 {
public static void main(String[] args) {
// AbstractClass ac = new AbstractClass();
// 추상클래스를 상속받아 추상메서드를 구현한 서브클래스의 인스턴스 생성
SubClass sc = new SubClass();
sc.abstractMethod(); // 서브클래스 오버라이딩 추상메서드!
// new MiddleClass();
// 추상클래스는 인스턴스 생성은 불가능 하지만, 변수는 가능(다형성)
// 변수의 클래스 타입으로 사용할 수 있다!
AbstractClass ac = new SubClass2(); // SubClass2 -> AbstractClass 업캐스팅
// 업캐스팅 시 참조영역이 축소되지만, 추상메서드 호출이 가능하다!
ac.abstractMethod(); // AbstractClass -> MiddleClass -> SubClass2
}
}
abstract class AbstractClass {
// 바디를 정의할 경우 오류 발생!
// public abstract void abstractMethod() {
// System.out.println("일반 메서드!");
// }
public abstract void abstractMethod();
// 추상클래스는 멤버변수와 일반 메서드, 생성자도 가질 수 있다.
int a; // 인스턴스 멤버변수
static int b; // static 멤버변수
public AbstractClass() {} // 생성자
public void print() {} // 일반메서드
public static void print2() {} // static 메서드
}
// 추상클래스를 상속받는 서브클래스 정의(= 실체(구현체) 클래스)
// => 추상클래스는 인스턴스 생성은 불가능하지만 상속은 가능하다!
class SubClass extends AbstractClass {
@Override
public void abstractMethod() {
// 메서드 내의 코드는 서브클래스에서 기술할 수 있다!
System.out.println("서브클래스 오버라이딩 추상메서드!");
}
}
abstract class MiddleClass extends AbstractClass {}
class SubClass2 extends MiddleClass {
// 추상클래스의 서브클래스가 추상클래스로 선언된 상태에서
// 해당 클래스를 상속받은 서브클래스에서 추상메서드를 구현
@Override
public void abstractMethod() {
System.out.println("AbstractClass -> MiddleClass -> SubClass2");
}
댓글