제어자 abstract를 포스팅 하면서 추상클래스와 추상메소드는 

1
2
3
4
abstract class AbstractTest{    
    abstract void hello();
}
 
cs

이렇게 생겼다면서 아주 무책임하게 포스팅을 했었습니다.


이번에는 저렇게 생긴 추상클래스와 추상메소드에 대해 조금 더 알아보겠습니다.


클래스가 객체를 만들기위한 틀, 즉 설계도 라고 한다면, 추상클래스는 완성되지않은 설계도라고 말할 수 있습니다.

완성되지 않았다는 것은 추상메소드를 포함함을 의미합니다.

한마디로 추상메소드를 포함한 클래스를 추상클래스 라고 합니다.


추상메소드는 위의 소스를 보시다시피 메소드의 내용을 기술해야할 부분(중괄호)이 존재하지 않습니다.

그리고 세미콜론(;)으로 끝을 알립니다.

결국은 추상메소드는 완성되지 않은 메소드입니다.


추상클래스를 사용하기 위해서는 상속을 받아서 추상메소드를 오버라이딩을 해야 합니다.

즉, 추상클래스는 강제적으로 상속을 시키게 하는거죠.


추상클래스가 부모클래스가 되어서 추상메소드를 이용해 미완성의 메소드를 만들어놓고

이 추상클래스를 상속받은 자식클래스에게 책임을 주는 것 입니다.



위와 같이 abstract가 붙은 클래스를 사용하려고 하면 에러가 납니다.

에러이유는 인스턴스화를 할 수 없다는 에러입니다.


위에서 얘기한 것 처럼 상속을 이용해 사용하여야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.dreamstorage.abstractDemo;
 
abstract class Animal{
    protected String name;
    protected String crying;
    
    public void setAnimal(String name, String crying){
        this.name = name;
        this.crying = crying;
    }
    
    public abstract void makeAnimal();
    
    public void make(){
        makeAnimal();
    }
}
class Cat extends Animal{
    
    @Override
    public void makeAnimal(){
        System.out.println("이 동물은 고양이 입니다.");
        System.out.println(this.name + "에요~" + "\n" + this.crying + "하고 울어요~");
    }
}
 
public class AbstractMain {
    public static void main(String[] args) {
        //Animal animal = new Animal(); 에러
        Cat cat = new Cat();
        cat.setAnimal("냥이""야옹");
        cat.makeAnimal();
    }
}
cs

어떻게 예제를 만들어봐야 되나 고민을 많이 해봤는데.. 그닥 좋은 소스는 아닌 것 같습니다 ;


아무튼 추상클래스를 사용하기 위해선 상속을 하여야 한다고 하였으므로 Cat 클래스에서 상속을 받았습니다.

그리고 추상메소드인 makeAnimal()을 오버라이딩하였습니다.


또한 소스에서 보듯이 추상클래스라고 추상메소드만 있어야 되는게 아니라 일반적인 클래스와 같이 멤버변수, 메소드, 생성자를 가집니다.