추상클래스란?

김운채·2023년 5월 3일
0

Java

목록 보기
6/11

추상클래스(abstract class)


클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 클래스가 미완성이라는 것은, 미완성 메서드(추상메서드)를 포함하고 있다는 의미이다.

미완성 설계도는 왜?

서로 다른 설계도를 따로 그리는 것보다, 이들의 공통부분만을 그린 미완성 설계도를 만들어 놓고, 이걸 이용해서 각각의 설계도를 완성하는 것이 훨씬 효율적일 것이다. 우리가 디자인된 PPT 템플릿을 가져다 쓰는 것처럼^^

미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성할 수 없다.(=new 연산자를 사용할 수 없다는 의미) 추상클래스는 상속을 통해서 자손 클래스에 의해서만 완성될 수 있다.

따라서 반드시 추상 클래스를 어느 자식의 클래스에 상속시키고, 자식 클래스를 인스턴스화 하여 사용해야 한다.
자바에서 클래스의 다중 상속은 불가능하기때문에 단일 상속이 가능하다.

abstract class Animal { 
}

class Cat extends Animal { // 추상 클래스 상속
}

class Dog extends Animal { 
}

public class Main {
    public static void main(String[] args) {
		// 추상 클래스를 상속한 자식 클래스를 객체로 초기화
        Cat c = new Cat(); 
        Dog d = new Dog();
    }
}


1-2. 추상 메서드

메서드를 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상 메서드이다. 즉, 설계만 해놓고 실제 수행될 내용은 작성하지 않았기 때문에 미완성 메서드인 것이다.

abstract class 클래스이름 {
    ...
    abstract 반환타입 메소드이름();
    ...
}

메서드를 이와 같이 미완성으로 남겨 놓는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워 두는 것이다.

추상화, 구체화

상속이 자손 클래스를 만드는 데 조상 클래스를 사용하는 것이라면, 이와 반대로 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상 클래스를 만드는 것이라고 할 수 있다.

- 추상화: 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
- 구체화: 상속을 통해 클래스를 구현, 확장하는 작업


1-2. ❓ 근데 굳이 추상화를 왜 쓸까?

1) 공통 멤버의 통합으로 중복 제거

상위 클래스의 특징을 하위클래스에서 그대로 물려 받아 사용할 수 있는 상속 특징을 이용하여 코드의 중복 제거, 코드 재사용성 증대 효과를 누릴 수 있게 된다.

즉, 자주 사용될 것이 예상되는 기능을 모아놓은 추상 클래스를 한번 만들어 놓으면 편하게 재사용을 함으로써 유지보수 효율화를 추구할 수 있는 것이다.

2) 구현의 강제성을 통한 기능 보장

또다른 이유는 자손 클래스에서 추상메서드를 반드시 구현하도록 강요하기 위해서다.

class Player{
	void play(){}
    void stop(){}
}

만일 추상메서드로 정의되어 있지 않고 위와 같이 빈 몸통만 가지도록 정의되어 있다면, 상속받는 자손 클래스에서는 이 메서드들이 온전히 구현된 것으로 인식하고 오버라이딩을 통해 자신의 클래스에 맞도록 구현을 깜박할 수 도 있기 때문이다.

3) 규격에 맞는 설계 구현

실제 프로젝트에서 어플리케이션 아키텍쳐(Application Architecture)가 설계해 놓은 추상 클래스를 상속받으면, 개발자는 프로젝트에서 필요하고 공통적으로 들어가야하는 필드와 메서드를 오버라이딩해서 큰 설계를 생각할 필요 없이 구현만 하면 된다.

이렇게 하면 초기 설계 시간이 절약되고, 구현에만 집중할 수 있게 된다는 장점이 있다. 미리 규격에 맞게 소스가 구현되어 있기 때문에 해당 규격에 대한 구현부만 수정하면 손 쉽게 기능 수정이 가능하기 때문이다.

참고자료: /inpa.tistory.com/entry/JAVA-☕-추상-클래스Abstract-용도-완벽-이해하기#thankYou
https://junior-datalist.tistory.com/213

0개의 댓글