-
추상 클래스 (abstract class)백엔드/자바 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값을 인쇄 } }
추상 클래스는 객체를 생성할 수는 없으나 위처럼 생성자를 이용하는 것이 가능하다.
생성자는 자식 클래스가 생성될 때마다 추상메서드가 새롭게 초기화 되는 역할을 하게 된다.
'백엔드 > 자바' 카테고리의 다른 글
추상클래스, 인터페이스와 다형성 (0) 2020.08.07 인터페이스 (interface) (0) 2020.08.07 추상 메서드 (abstract method) (0) 2020.08.06 상속과 다형성(polymorphism) (0) 2020.08.05 초기화 (0) 2020.08.05