티스토리 뷰

JAVA/JAVA기본

JAVA - 추상 클래스란?

realizers 2022. 1. 16. 00:53
728x90
반응형

추상 클래스


  • 하나 이상의 추상 메서드를 포함하는 클래스입니다.
  • 추상 메서드란 선언부만 존재하며 본체는 없는 함수입니다.
  • 해당 메서드 앞에 abstract 라는 키워드를 붙이며 추상 메서드가 포함되어 있다면 클래스 또한 추상 클래스이어야 하므로 클래스명 앞에 abstract 키워드가 있어야 합니다.
  • 어떠한 추상 클래스를 상속받은 자식 클래스에서 추상 메서드를 구현하지 않는다면 자식 클래스 또한 추상 클래스가 되어야 합니다.
  • 객체를 생성할 수 없다는 점을 제외하고는 일반 클래스와는 다른점이 없으며, 멤버 변수와 일반 메서드를 가질 수 있습니다. 
// 객체 생성 불가능
Animal animal = new Animal();

 

추상 클래스의 목적

추상 클래스는 일반 클래스와 달리 객체를 생성할 수 없다고 했는데 어떠한 목적을 가지고 있는지 살펴보자


  • 공통된 필드와 메소드를 통일하는 용도
    • 여러명의 개발자들이 Animal을 상속 받아 각자만의 실체 클래스를 구현하게 되면 각 개발자마다 변수명과 메서드명은 각각 다른 이름으로 구현이 될것입니다. 이렇게 되면 나중에 유지보수가 힘들고 통일성이 없게됩니다.
  • 실체 클래스 구현시 시간을 절약한다.
    • 동물에 대한 클래스를 구현해야하는데 어떤 동물일지 모를 경우 동물 추상 클래스를 상속받으면 동물에 대한 공통적인 필드와 메서드만 구현을 하면된다. 이때 오버라이딩을 하여 구현에 집중을 할 수 있습니다.
  • 규격에 맞는 실체 클래스 구현
    • 설계를 담당하시는 개발자분께서 규격에 맞는 구현 클래스를 작성하게 되면 해당 규격에 맞는 구현 클래스를 작성할 수 있습니다.

 

 

추상 클래스 사용 방법


  • 추상 메서드는 접근 지정자로 private를 사용할 수 없는데 그 이유는 구현을 강제화하는데 자식 클래스에서 구현을 할 수 없기때문입니다.
  • public, protected는 사용할 수 있고 생략을 한다면 default(같은 패키지에서만 접근 가능)가 됩니다.
  • dog, cat1, cat2 객체를 생성할때마다 추상 클래스의 생성자 호출 후 자식 클래스의 생성자 호출됨
    • super()메서드
public abstract class Animal {
    // 멤버 변수
    public String name;
    public int age;

    // 생성자
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 일반 메서드
    public void breath(){
        System.out.println("숨을 쉰다.");
    }

    // 추상 메서드
    abstract void sound();
}

public class Dog extends Animal{

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

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

public class Cat extends Animal{

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

    @Override
    void sound() {
        System.out.println("야옹 야옹!");
    }
}

public class Example {
    public static void main(String[] args) {
        Animal dog = new Dog("코코", 2);
        Animal cat1 = new Cat("나비", 1);
        Animal cat2 = new Cat("톰", 3);

        // 이름 : 코코, 나이 : 2
        System.out.println("이름 : " + dog.name + ", 나이 : " + dog.age);

        // 이름 : 나비, 나이 : 1
        System.out.println("이름 : " + cat1.name + ", 나이 : " + cat1.age);

        // 이름 : 톰, 나이 : 3
        System.out.println("이름 : " + cat2.name + ", 나이 : " + cat2.age);

        dog.breath();  // 숨을 쉰다.
        dog.sound();   // 멍멍!
        cat1.breath(); // 숨을 쉰다.
        cat1.sound();  // 야옹 야옹!
        cat2.sound();  // 야옹 야옹!
    }
}

 

추상 클래스의 메서드 구현 강제화


  • 추상 클래스에서 추상 메서드를 선언했다면 추상 클래스를 상속 받는 자식 클래스에서 추상 메서드는 반드시 구현을 해야하지만 일반 메서드는 필요시에 구현을 하면 됩니다.
  • Animal을 상속받은 Cat 클래스는 일반 메서드인 breath는 구현을 하지 않은것을 확인할 수 있습니다.
public abstract class Animal {
    // 멤버 변수
    public String name;
    public int age;

    // 생성자
    public Animal(String name, int age) {
        System.out.println("추상 클래스의 생성자 호출");
        this.name = name;
        this.age = age;
    }

    // 일반 메서드
    public void breath(){
        System.out.println("숨을 쉰다.");
    }

    // 추상 메서드
    abstract void sound();
}

public class Cat extends Animal{

    public Cat(String name, int age) {
        super(name, age);
        System.out.println("자식 클래스의 생성자 호출");
    }

    @Override
    void sound() {
        System.out.println("야옹 야옹!");
    }
}
728x90
반응형