추상 클래스(Abstract Class)

syeon·2022년 1월 5일
0

Java

목록 보기
1/4

추상클래스

추상 클래스는 구체적인 내용은 작성하지 않고, 공통적인 특징을 추상적으로 선언한 클래스이다.

여기서 공통적인 특징은 필드나 메서드가 될 수 있는데, 메서드의 경우 리턴값조차 갖지 않고 메서드명만 선언될 뿐이다.

추상 클래스와 추상 메서드의 선언은 클래스 앞에 abstract 키워드를 붙이면 된다.

abstract class Animal {
	abstract void cry();
}

아무래도 구체적인 내용이 없기 때문에 추상 클래스만으로는 객체를 생성할 수가 없다.
따라서 추상 클래스를 활용하기 위해서는 추상 클래스에 대한 구체적인 설명이 필요하다!

Animal animal = new Animal(); // Error!

🤔 추상 클래스 사용 방법

구체적인 설명을 어떻게 정의할 수 있을까? > 바로 상속이다.
추상 클래스를 상속받는 자식 클래스에서 해당 추상 메서드를 오버라이드(Override)하여 재정의한다면 추상 클래스 활용이 가능하다. 예제를 통해 살펴보자.

우선 앞에서 등장했던 Animal이라는 이름의 추상 클래스를 다음과 같이 선언하였다.

abstract class Animal {
    String kind;
    void common() {
        System.out.println("동물이다");
    }
    abstract void cry();
}

구성을 보면 일반 변수와 함수, 그리고 추상 메서드를 가지고 있다.
사실 추상 클래스는 abstract를 앞에 붙이고 클래스 안에 추상 메서드를 포함하고 있다는 것을 제외하면 사실상 일반 클래스와 별반 차이 없다. Field, Constructor, Method(추상메서드가 아닌 일반 메서드) 모두 포함 가능하다.

class Dog extends Animal {
    public Dog() {
        this.kind = "포유류";
    }

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

Animal 클래스를 구현한 (상속 받은) Dog 클래스이다.
이때 변수 kind와 메서드 commom()은 정의할 필요 없지만, 추상 메서드 cry()를 오버라이드하여 재정의하지 않으면 오류가 난다.

Dog dog = new Dog();
dog.common();
dog.cry();
System.out.println(dog.kind);
---------------------------------------------
>> 동물이다
>> 멍멍
>> 포유류

그 외 다양한 활용 예제

class Crow extends Animal {
    public Crow() {
        this.kind = "조류";
    }

    @Override
    void cry() { System.out.println("깍"); }
}
Animal cat = new Animal() {
	@Override
	void cry() {
		System.out.println("야옹");
	}
};
cat.cry();
Animal poodle = new Dog(); // 자동 형변환
poodle.cry();
-----------------------------------------------
>> 멍멍

이렇듯 추상 클래스는 부모 클래스의 역할을 수행한다. 하지만 구체적인 사용은 자식 클래스에서의 재정의를 통해서만 가능하다는 강제성을 띄고 있다. 덕분에 추상 클래스에서 선언만 해놓음으로써 새로운 클래스를 작성할 때마다 하나의 틀을 제공한다.

🤔 추상 클래스의 기능, 추상 클래스는 왜 필요한 것인가

왜 이렇게까지 해야 하는지 궁금할 것이다. 간단히 말하면 강제하기 위함이다. 부모(추상)클래스가 선언해놓은 메서드를 상속 받은 자식 클래스들이 이름 그대로 재정의해서 구현하라고 제한을 두는 것이다.
상속 받은 자식 클래스 입장에서는 자칫하면 상속만 받고 재정의해서 사용을 안할 수도 있다.
따라서 활용성을 높이기 위해 상속 받은 자식 클래스 입장에서는 추상메서드를 재정의해서 구현하도록 하는 것이다.
만약 자식 클래스에서 상속 받은 추상 메서드를 구현하고 싶지 않다면 자식 클래스도 앞에 abstract를 붙여 추상 클래스로 만들면 된다.

정리 및 결론

  • 추상 클래스는 다른 (자식)클래스들의 공통적인 특징을 변수나 메서드로 정의해 놓는 것을 말함 -> 추상메서드

  • 메서드 선언만 있고 구체적인 내용 없음 -> 객체 생성 불가능 !

  • 부모 클래스로서의 역할 O, 하지만 구체적인 사용은 자식 클래스에서 재정의하야여 가능(강제성)

부모(추상) 클래스에서 구현 하지 않는 이유는 해당 메서드의 구현이 상속 받는 클래스에 따라서 달라질 수 있기 때문에 선언만 해둔 것이다.
덕분에 추상 클래스는 여러 명의 개발자가 작업할 때 코드의 확장과 분업을 효율적으로 처리할 수 있게 해준다.
따라서 분업화된 시스템에서 공통의 프로젝트를 진행할 때 많이 사용되어지는 중요한 문법이다!

profile
기록하려고 만든 개발블로그, 까먹지 말자!

0개의 댓글