끝나지 않는 프로그래밍 일기


1. 추상 클래스(Abstract Class)


오늘 우리가 배울 추상 클래스(Abstract Class)란 완전하지 않은 클래스를 의미합니다. 간단히 추상 클래스를 살펴보기 전에 특징부터 알아보도록 합시다.


 추상 메소드가 하나 이상 포함되면 반드시 추상 클래스로 선언되어야 한다.

반드시 추상 클래스를 상속하는 자식 클래스에서 부모가 가진 추상 메소드를 모두 오버라이딩 해야 한다.

추상 클래스에서 추상 메소드가 아닌 일반 메소드를 포함시킬 수 있다.

추상 메소드는 몸체가 없고 선언부만 존재한다.


추가로 추상 클래스는, 상속 관계에서 어느 메소드를 오버라이딩 할때 사용됩니다. 우리가 앞으로 배울 abstract 키워드를 사용하여 추상 메소드, 클래스임을 알려줄 수 있습니다. 다음은 추상 클래스를 선언하는 방법입니다.


abstract 클래스명 {   

...

abstract void 메소드명();

}


위의 추상 메소드를 보시면 이미 말했듯이 몸체는 없고 선언부만 존재합니다. 이는 자식 클래스들의 특징이 서로 다를때 메소드를 미완성 메소드로 남겨두어 부모 클래스를 상속한 자식 클래스에서 각각의 기능을 구현할수 있도록 한것입니다. 직접 추상 클래스를 선언해봅시다. 아래는 자식 클래스의 공통된 부분을 추상 클래스로 정의하여 사각형, 삼각형 넓이를 구하는 프로그램입니다.


abstract class Figure {

abstract void area(int a, int b);

}


class Tetragon extends Figure {

void area(int a, int b) {

System.out.println("사각형의 넓이 : " + (a * b));

}

}


class Triangle extends Figure {

void area(int a, int b) {

System.out.println("삼각형의 넓이 : " + (a * b / 2));

}

}


class Simple {

public static void main(String args[]) {

Tetragon tetragon = new Tetragon();

tetragon.area(4, 5);


Triangle triangle = new Triangle();

triangle.area(12, 5);

}

}


결과:

사각형의 넓이 : 20

삼각형의 넓이 : 30


코드를 보시면 1행에서 Figure라는 추상 클래스가 선언되었고 그 추상 클래스 내부에 area라는 추상 메소드가 선언되었습니다. 5행에서는 추상 클래스 Figure를 상속한 Tetragon 클래스에서 메소드 area를 오버라이딩 하여 사용합니다. 이것은 a와 b를 서로 곱하여 결과를 내놓습니다. 그 아래의 Triangle 클래스는 어떨까요? 마찬가지로 Figure 클래스를 상속하였고 메소드 area를 오버라이딩 하여 사용합니다. 여기의 area는 a와 b를 곱한 뒤 2로 나누고 그 결과를 내놓습니다.


19~20행을 보시면 Tetragon 객체를 생성하고 그 객체 내의 area라는 메소드를 호출하고 있죠? 4와 5를 매개변수로 넘겨주어, 4와 5를 곱한 20을 결과로 내놓습니다. 22~23행도 마찬가지로 Triangle 객체를 생성하고 area 메소드를 호출하여 12와 5를 매개변수로 받고 12와 5를 곱하고 2로 나눈 결과 30을 내놓습니다.


- 추상 클래스를 사용하면서 한가지 주의하실 점이 있는데 추상 클래스로는 객체를 만들 수 없습니다.


...

Figure figure = new Figure();

...


에러:

AsarOperators.java:19: error: Figure is abstract; cannot be instantiated

                Figure figure = new Figure();

                                ^

1 error



추상 클래스 강좌는 여기서 마치겠습니다. 다음 강좌는 인터페이스(interface)에 대해 공부합니다.


수고하셨습니다.