ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 추상 클래스 (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
Designed by Tistory.