본문 바로가기
Java

[Java] 자바 추상 클래스(Abstract Class) 예제

by teamnova 2023. 5. 1.

추상클래스란?

추상클래스는 일반 클래스와 별 다를 것이 없습니다. 단지, 추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스입니다. 그래서 미완성 설계도라고도 표현합니다. 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없습니다.

 

또한 추상클래스를 상속해 생성된 자손 클래스는 상속받은 클래스의 메서드를 선언하지 않고선 사용할 수 없는 강제성을 띄게 되는데 이러한 특징을 잘 활용하면 

 

코드를 작성하는 데 있어서 발생하는 실수를 줄여주고 유지와 보수적인 측면에서 조금 더 효율적으로 사용할 수 있습니다.

 

사용법

사용법은 생각보다 간단합니다. 

 

클래스 앞에 abstract 키워드를 붙여 작성해주면 자연스럽게 추상클래스가 생성됩니다. 

이후 필요한 추상메서드들을 추가해 주면  해당 추상클래스를 상속받은 클래스는 추상클래스에 선언된 추상 메서드를 재정의 해야 합니다.

 

예제를 통해 직접 추상클래스를 구현해 보겠습니다.

 

동물 이라는 추상클래스를 만들어 보겠습니다. 

 

동물은 이름과 나이가 있고 

움직이고 , 먹고 , 짖을 수 있습니다. 

 

public abstract class Animal {

    String name;
    int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void move() {System.out.println("이동한다");}
    public void eat() {System.out.println("먹는다");}
    public abstract void bark(); //짖는 소리는 동물마다 다르므로 추상메서드로 생성
}

 

동물마다 다른 짖는 소리를 설정해 주기 위해 추상메서드 bark를 작성해 주고 동물 클래스를 상속받아 다른 동물 클래스를 만들어 보겠습니다. 

 

 

 

추상 메서드가 정의되지 않아 정상적으로 작성되지 않는  Cat 클래스

Cat 클래스에 추상클래스인 Animal 을 상속받게 되면 

 

추상메서드인 bark() 를 재정의해 주기 전까진 정상적으로 코드가 작성되지 않습니다. 

 

bark() 메서드를 재정의 함으로써 정상화 된 클래스

Cat 클래스의 bark() 메서드는 고양이 울음소리를 설정해 주었습니다. 

 

다른 동물들도 Animal 클래스를 상속받아 만들어 보겠습니다. 

 

public class Dog extends Animal{

    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void bark() {
        System.out.println("멍멍!!");
    }
}
public class Cat extends Animal {

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void bark() {
        System.out.println("야옹~~");
    }

}
public class Cow extends Animal{

    public Cow(String name, int age) {
        super(name, age);
    }

    @Override
    public void bark() {
        System.out.println("음메~!!");
    }
}

이후엔 기존의 클래스와 동일하게 모든 동물 클래스에서 bark() 함수를 사용할 수 있지만 각각의 내용이 달라지는 것을 확인할 수 있습니다. 

public class main {
    public static void main(String[] args){

        Dog dog = new Dog("강아지",3);
        Cat cat = new Cat("고양이",3);
        Cow cow = new Cow("소",3);

        cow.move();
        cow.bark();// 같은 클래스/ 같은 함수 선언

        dog.move();
        dog.bark();// 같은 클래스/ 같은 함수 선언

        cat.move();
        cat.bark();// 같은 클래스/ 같은 함수 선언

    }
}

메인 스레드에서 다음과 같이 각각의 객채를 선언하여 bark() 메서드를 실행시켜 봅니다. 

 

실행 결과

정상적으로 추상 메서드가 작동하는것을 볼 수 있습니다.