추상 클래스(abstract class)란 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스이다. 추상 메소드는 선언만 있고 본체는 없는 함수이며 선언부에 ‘abstract’ 라는 키워드를 붙인다. 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 ‘abstract’키워드를 붙여야 한다.


abstract class Animal {
   public String sName; //일반 멤버 변수
   ….
   public void move() { …} // 일반 메소드
   abstract void howl(); //추상 메소드
   …
}


추상 클래스는 추상 메서드를 포함하고 객체화 할 수 없다는 점만 제외하고 일반 클래스와 다르지 않으며 생성자, 멤버변수와 일반 메서드도 가질 수 있다. 추상 클래스 자체로는 클래스로의 역할을 하지 못하며 객체를 생성할 수 없지만 새로운 클래스를 작성하는데 있어서 부모 클래스로서 중요한 역할을 갖는다. 위의 예에서 Animal 클래스는 직접 객체를 생성하지 못하고 이를 상속받는 자식 클래스에서는 추상 메소드의 구체적인 본체를 가질 수 있다.


package tut02;

abstract class Animal {
   public String sName;
   public void move() {
       System.out.println("어슬렁 어슬렁");
   }
   abstract void howl();
}

class Dog extends Animal {
   public void move() {
       System.out.println("팔짝 팔짝");
   }

   void howl() {
           System.out.println("멍멍");
   }
}

class Cat extends Animal {
   void howl() {
           System.out.println("냐옹");
   }
}

public class Tut02 {

   public static void main(String[] args) {
       Dog happy = new Dog();
       Cat julia = new Cat();
       happy.move(); // 오버라이드된 멤버함수 호출
       happy.howl(); // 구현된 멤버함수 호출
       jular.move(); // 일반 멤버함수 호출
       julia.howl(); // 구현된 멤버함수 호출
   }
}
실행 결과
팔짝 팔짝
멍멍

어슬렁 어슬렁

냐옹


추상 메소드의 접근 지정자로 private는 사용할 수 없는데 이는 자식 클래스에서 받아서 구현되어야 하므로 당연하다. 다른 접근 지정자(public, protected)는 사용할 수 있고 생략되면 default (즉, 같은 패키지 안에서만 접근 가능)인 것은 일반 클래스와 동일하다.


 위의 예에서 처럼 추상 클래스는 다른 클래스들에게서 공통으로 가져야하는 메소드들의 원형을 정의하고 그것을 상속받아서 구현토록 하는데 사용된다. 메소드 오버라이드(override)와 유사해서 혼동하기 쉬우나 오버라이드는 안해도 상관없지만 추상 메소드는 자식 클래스에게 그 구현을 강요하는 기능을 한다. 위 예에서도 Dog 클래스는 move()메소드를 오버라이드 했지만 Cat클래스는 그러지 않았다. 하지만 howl()메소드는 반드시 구현해야 한다. 그리고 만약 어떤 추상클래스를 상속 받은 자식 클래스에서 추상 메소드를 구현하지 않았다면 자식 클래스도 추상 클래스가 되어야 한다는 점도 알아 두자.



Posted by 살레시오
,