[Java] 5. 3 추상화

5. 3 추상화

java에서는 abstract 키워드를 사용하여 추상 클래스와 추상 메서드를 만들 수 있습니다.

추상 클래스는 개체를 생성할 수 없고 기반 클래스의 역할만 수행하는 클래스입니다. 추상 클래스를 만들 때는 class 정의문 앞에 abstract 키워드를 명시합니다.

추상 메서드는 메서드 내부 정의가 없는 메서드입니다. 이는 파생 형식에서 재정의해야 합니다. 추상 메서드를 만들 때도 메서드 앞에 abstract 키워드를 명시합니다. 그리고 추상 메서드를 하나라도 있으면 반드시 추상 클래스로 지정해야 합니다.

[소스 5.6] 추상화 예

package ex_abstract;
public abstract class Musician {
    public abstract void play();
}
package ex_abstract;
public class Pianist extends Musician{
    @Override public void play(){
        System.out.println("딩동댕");
    }
}
package ex_abstract;
public class Program {
    public static void main(String[] args){
        Pianist pianist = new Pianist();
        pianist.play();
    }
}

실행 결과

랄라라

그리고 다른 추상 클래스를 기반으로 파생 클래스 또한 추상 클래스로 정의할 수도 있습니다. 이 때 파생 클래스(이 또한 추상 클래스)에서는 기반 클래스의 추상 메서드를 꼭 정의할 필요는 없습니다. 추상 클래스의 상대적인 개념인 개체 인스턴스를 생성하는 것을 허용하는 클래스를 구상 클래스라고 부릅니다. 그리고 구상 클래스는 기반 클래스에서 약속한 모든 추상 메서드를 구현해야 합니다.

다음의 예는 BaseAClass 추상 클래스를 기반으로 파생 클래스 DerivedAClass(이 또한 추상 클래스)를 정의하고 이를 기반으로 파생한 DrivedClass(구상 클래스)를 정의한 예제입니다.

[소스 5.7] 계층화 추상 클래스 예

//최상위 추상 클래스
public abstract class BaseAClass {
	public abstract String getString();
}
//파생 클래스(추상 클래스)
public abstract class DerivedAClass extends BaseAClass {
	public abstract int getNum();
}
//파생 클래스(구상 클래스)
public class DerivedClass extends DerivedAClass {
	@Override public String getString(){
		return "test";
	}
	@Override public int getNum()	{
		return 0;
	}
}
//계층화 추상 클래스 진입 클래스
public class Program {
	public static void main(String[] args){
		DerivedClass dc = new DerivedClass();
		System.out.println(dc.getString());
		System.out.print(dc.getNum());
	}
}

실행 결과

test
0

프로그래밍에서 추상 클래스를 사용하는 목적은 다양할 수 있습니다. 특히 여러 종류의 파생 클래스의 공통적인 부분을 기반 클래스에 정의하여 같은 방법으로 사용한다는 상속과 다형성의 기본적인 목적이 제일 중요합니다. 특히 파생 클래스에서 제공할 메서드의 시그니쳐는 같지만 구체적인 구현이 다를 수 있을 때 추상 클래스에서 “이러한 기능을 제공하는 메서드를 정의할게요.”라고 약속하고 파생 클래스(구상 클래스)에서 이러한 약속을 구체적으로 구현하여 상속과 다형성의 장점을 보다 높일 수 있습니다.