본문 바로가기

프로그래밍언어/Java

[Java 기본] 추상 클래스

추상 클래스


동물(Animal)과 같이 부모 클래스는 제공하지만, 실제 생성되면 안되는 클래스를 추상 클래스라 한다. 추상적인 개념을 제공하는 클래스로서 실체인 인스턴스가 존재하지 않는다. 

상속을 목적으로 사용되고, 부모 클래스 역할을 담당한다. 

 

 

사용법


  • 클래스를 선언할 때 앞에 추상이라는 의미의 abstract 키워드를 붙인다. 
  • 기존 클래스와 동일하나 new AbstractAnimal()와 같이 직접 인스턴스를 생성하지 못하는 제약이 있다. 
abstract class AbstractAnimal {...}

 

추상 메서드


부모 클래스를 상속 받는 자식 클래스가 반드시 오버라이딩 해야 하는 메서드를 부모 클래스에 정의할 수 있다. 이것을 추상 메서드라 한다. 

  • 추상 메서드는 선언할 때 메서드 앞에 추상이라는 의미의 abstract 키워드를 붙인다.
  • 추상 메서드가 하나라도 있는 클래스는 추상 클래스이다. 
  • 추상 메서드는 상속 받는 자식 클래스가 반드시 오버라이딩 해서 사용해야 한다. 
    • 따라서 바디가 없다. 
    • 오버라이딩 하지 않으면 자식도 추상클래스가 되어야 한다 .
public abstract void sound();

 

예제


AbstractAnimal.java

public abstract class AbstractAnimal {

    public abstract  void sound();
    
    public void move() {
        System.out.println("동물이 움직입니다. ");
    }
}

=> move는 추상메서드가 아니다 따라서 자식에서 오버라이딩 해도 되고 안해도된다. 

 

Dog.java

public class Dog extends AbstractAnimal{

    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}

 

Cat.java

public class Cat extends AbstractAnimal{

    @Override
    public void sound() {
        System.out.println("냐옹");
    }
}

 

Caw.java

public class Caw extends AbstractAnimal{

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

 

AbstractMain.java

public class AbstractMain {

    public static void main(String[] args) {
        // 추상클래스 생성 불가
        // AbstractAnimal animal = new AbstractAnimal();

        Dog dog = new Dog();
        Cat cat = new Cat();
        Caw caw = new Caw();

        cat.sound();
        cat.move();

        soundAnimal(dog);
        soundAnimal(cat);
        soundAnimal(caw);

    }

    public static void soundAnimal(AbstractAnimal animal) {
        System.out.println("동물 소리 테스트 시작");
        animal.sound();
        System.out.println("동물 소리 테스트 종료");
    }
}

 

실행결과

 

 

정리


이전 포스팅 마지막에 다루었던 문제점을 추상 클래스와 추상 메서드를 통해 모두 해결했다. 

  • 추상 클래스 덕분에 실수로 Animal 인스턴스를 생성할 문제를 근본적으로 방지해준다.
  • 추상 메서드 덕분에 새로운 동물의 자식 클래스를 만들 때 실수로 sound() 오버라이딩을 누락시키는 문제를 근본적으로 방지해준다. 

 

 

순수 추상 클래스


모든 메서드가 추상 메서드인 추상 클래스. 이 경우 실행하는 로직을 전혀 가지고 있지 않다. 다형성을 위한 부모타입으로서 껍데기 역할만 한다. 

이런 순수 추상클래스의 개념은 프로그래밍에서 자주 사용된다. 자바는 이를 더 편하게 사용할 수 있도록 인터페이스라는 개념을 제공한다. 

 

 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.