[Java] 객체지향 프로그래밍 - 추상 클래스

추상 클래스(Abstract Class)

클래스를 설계도에 비유하면, 추상 클래스Abstract Class는 미완성 설계도에 비유할 수 있어요. 말 그대로 완성되지 못한 채로 남겨진 설계도를 말해요.

미완성 설계도로 제품을 완성할 수 없듯이, 추상 클래스를 통해 인스턴스를 생성할 수 없어요. 추상 클래스는 상속을 통해 자식 클래스에 의해서만 완성될 수 있어요.

왜 굳이 이런 기능이 필요할까 싶은데, 이는 새로운 클래스를 작성할 때 아무 것도 없는 상태에서 시작하는 것보다는 완전하지 못하더라도 어느 정도 틀을 갖춘 상태에서 시작하려고 할 때 도움이 되요. 제품에 공통으로 사용하는 기능들을 naive하게 구현을 하고 작업하게 된다면 추후 다른 파생 제품을 만들 때도 이런 기반을 숙지하고 만들 수 있기 때문에 편리한 기능이라고 볼 수 있어요.

미완성된 설계도라 해도 일반 클래스처럼 멤버변수와 메서드를 가질 수 있어요.

public abstract class A {
	int a;
    A() { a = 0; }
    A(int a) { this.a = a; } 
}

추상 클래스로부터 상속받는 자식 클래스는 오버라이딩을 통해 조상인 추상 클래스의 추상 메서드를 모두 구현해줘야 해요. 만일 부모로부터 상속받은 추상 메서드 중 하나라도 구현하지 않는다면, 자식 클래스 역시 추상 클래스로 지정해줘야 해요.

abstract class A {
    abstract void func();
    void func2() {}
}

// Error! 반드시 추상 메서드인 func()를 오버라이딩 해줘야 해요
class B extends A {
    
}

기본적인 문법은 이정도고 예제를 통해 추상 클래스의 필요성을 어느정도 해소시켜 볼게요.

abstract class Unit{
    abstract void move(int x, int y);
    abstract void attack();
    abstract void dead();
}


class Marine extends Unit {
    void move(int x, int y){
        System.out.println("발로 움직인다.");
    }
    void attack() {
        System.out.println("총을 갈긴다.");
    }
    void dead() {
        System.out.println("피를 흘리며 죽는다.");
    }
}

class Tank extends Unit {
    void move(int x, int y){
        System.out.println("바퀴를 돌아 움직인다. 탱크 모는 소리가 난다.");
    }
    void attack() {
        System.out.println("대포를 쏜다. 시즈 모드는 더 쎄고 느리게 쏜다.");
    }
    void dead() {
        System.out.println("펑~ 터지며 죽는다.");
    }
}
class Scourge extends Unit {
    void move(int x, int y){
        System.out.println("날라다닌다. 그래서 아무곳이나 돌아다닐 수 있다.");
    }
    void attack() {
        System.out.println("침을 뱉는다.");
    }
    void dead() {
        System.out.println("죽기전에 주변 놈들한테 피해를 주면서 죽는다.");
    }
}

가장 위에 있는 Unit은 움직여야하고, 공격도 가능하고 심지어 죽기도 해요. 그래서 이렇게 사전적으로 Unit으로 분류되는 것을 만들 때 이 기능은 반드시 존재해야 한다는 의미를 부여해요. 그래서 자식 클래스는 이 메서드를 구현하도록 강제시킬 수 있어요.

이렇게 클래스 간의 공통점을 찾아내서 공통의 메서드를 만드는 작업을 추상화라고 해요. 그리고 상속을 통해 메서드를 구현하는 것을 구체화라고 하고요.

임시 설계가 있으니 Unit으로 분류되는 객체들은 다 이런 기능들을 반드시 가지고 있을 수 있게 하면서, 그 객체마다 고유의 이동, 공격, 죽음을 구현할 수 있게 할 수 있죠. 물론 굳이?라고 생각하실 수도 있겠지만, 수천, 수만 개의 코드에서도 헤매지 않고 구현할 자신이 있을 때라면... 어우 적어도 전 자신 없네요 ㅎㅎ. 추상 클래스의 의미를 어느정도 이해하셨으리라 생각하고 여기까지만 적도록 할게요.

좋은 웹페이지 즐겨찾기