백엔드/자바

추상 클래스 (abstract class)

ksge7 2020. 8. 6. 18:50

추상클래스란?

추상 메서드를 가지고 있는 클래스를 말한다.

 

일반 클래스명 앞에 astract만 붙여주면 추상클래스로서 선언이 가능하다.

 

아래와 같은 경우 사용할 수 없다.

 

abstract class Animal{  // abstract + class + 클래스명
	abstract void bark();  // abstract 메서드
}

 

아래와 같이 추상 클래스를 상속하면 추상 클래스의 멤버변수와 메서드를 쓸 수 있다.

 

class test2 extends test{  // 추상 클래스 'test'를 상속 받아 선언한 'test2'

  int test_method(int a){  // 추상 클래스의 추상 메서드 'test_method'를 오버라이딩
    return a;
  }

}

 

추상 클래스와 일반 클래스의 차이

기본적으로 추상 클래스는 일반 클래스와 형태는 비슷하다.

 

추상 클래스도 일반클래스처럼 일반 멤버변수를 가질 수 있고 일반 클래스를 가질 수도 있다.

 

하지만 가장 큰 세 가지 차이점이 있다.

 

◎ 추상 클래스는 클래스명 앞에 abstract가 붙는다.

◎ 클래스 내에 추상 메서드가 단 하나라도 있으면 해당 클래스는 추상 클래스이 된다.

◎ 추상 클래스는 자신의 객체를 생성할 수 없다. 즉 인스턴스화가 불가능하다.

 

 

추상 클래스

일반 클래스

abstract

O

X

추상 메서드 소유 여부

O

X

객체 생성 가능 여부

X

O

일반 메서드 소유 가능 여부

O

O

일반 멤버변수 소유 여부

O

O

 

추상 클래스의 사용법

추상 클래스는 앞서 말했듯 객체를 가질 수 없다. 즉 인스턴스화가 불가능하다.

 

그래서 추상 클래스는 직접 사용할 수 없고, 상속을 통해 자손 클래스로 구현이 가능하다.

 

즉 상속을 하고 나서 추상 클래스 내의 추상 메서드들을 자손 클래스에서 모두 오버라이딩을 하면 비로소 추상 클래스를 사용할 수 있다.

 

아래와 같이 추상 상태로는 사용할 수 없다.

 

abstract class test{  // 추상 클래스 'test' 선언

  abstract int test_method(int a);  // 추상 메서드 'test_method' 선언

}

 

아래와 같이 추상 클래스를 extends를 이용해 상속하여 오버라이딩을 하면 추상 클래스의 추상 메서드와 멤버변수들을 쓸 수 있다.

 

class test2 extends test{  // 추상 클래스 'test'를 상속 받아 선언한 'test2'

  int test_method(int a){  // 추상 클래스의 추상 메서드 'test_method'를 오버라이딩
    return a;
  }

}

 

★ 상속시 주의 사항:  추상 클래스 상속시 클래스 내 모든 추상 메서드를 오버라이딩해야 오류가 없다.

 

추상클래스의 객체 생성과 생성자

추상 클래스는 객체 생성이 불가능하다. 근데 생성자는 있다.

 

추상 클래스에서 생성자는 보통 멤버 변수들의 초기화 등의 역할을 맡는다.

 

◎ 우선 추상 클래스 내에 생성자를 생성해준다.

 

abstract class test{  // 추상 메서드 test 선언

  int a;  // 멤버 변수 a는 0
  int b;  // 멤버 변수 b는 0

  test(){
    a = 10;  // 생성자 실행시 멤버 변수 a를 10으로 변경
    b = 15;  // 생성자 실행시 멤버 변수 b를 15로 변경
  }
}

 

◎ 추상 클래스를 상속 받은 일반 클래스 'test_method'에서 객체를 생성할 때 추상 클래스 내 생성자를 동시에 생성해준다.

 

class test_method extends test{  // 추상메서드 test를 상속 받은 'test_method' 클래스

  test_method(){  // 'test_method'의 생성자 생성
    super();  // 동시에 상속 받은 부모 클래스인 추상 클래스의 생성자 실행
  }
}

 

◎ 메인 함수 내에서 일반 클래스인 'test_method'의 객체 A를 생성해준다.

 

◎  'test_method' 클래스 생성자가 실행되고 super()도 실행되면서 추상클래스 'test'의 생성자가 실행된다.

 

◎  'test'의 생성자 안에서 'test'의 멤버변수 'a'의 값은 10으로 'b'의 값은 15로 변한다.

 

class Main {
  public static void main(String[] args) {
  
    test_method A = new test_method();  // 'test_method'의 객체 A 생성. super() 생성자도 실행
    System.out.println(A.a);  // 10출력. 인스턴스 A의 a값을 인쇄
  }
}

 

추상 클래스는 객체를 생성할 수는 없으나 위처럼 생성자를 이용하는 것이 가능하다.

 

생성자는 자식 클래스가 생성될 때마다 추상메서드가 새롭게 초기화 되는 역할을 하게 된다.