추상화
추상이란 실체 간에 공통되는 특성을 추출한 것을 말한다. 이를 해석하자면 어떤 실체에 대한 개념은 존재하지만,
실체에 대해 구체적인 내용은 없는 것을 말한다. 그리고 그 개념을 정의하는 것을 '추상화' 라 한다.
클래스로 추상의 개념을 확장해보면 객체를 직접 생성할 수 있는 클래스를 실체 클래스라 하고 실체 클래스의
공통적인 특성을 추출하여 특성에 대해 개념을 정리한 것을 추상 클래스라 한다.
즉, 추상 클래스를 부모로, 자식을 실체 클래스로 상속할 수 있다.
하지만 추상 클래스는 오직 개념만 존재하며 실체가 없기 때문에 인스턴스를 생성할 수 없다.
1. 추상 클래스를 쓰는 이유
추상 클래스를 사용하는 이유는 다음과 같다.
1) 자식에서 정의될 메소드의 형태를 강제시킬 수 있다.
=> 팀 작업에서 원활한 작업을 위해 전체적 플로우를 제시(사내 표준 정의가 가능)
2) 실체 클래스를 작성할 시간을 절약 (상속의 장점)
여기서 중요한 것은 1번이다.
메소드의 형태를 강제시킨다는 것은 메소드의 이름, 반환형, 매개변수를 고정시킨다는 얘기로, 추상클래스를
상속받아 사용하는 자식 클래스에서는 추상 클래스에 정의된 메소드의 시그니처 등을 반드시 따라야 한다.
이 특성을 살리기 위해 부모(추상) 클래스의 메소드를 반드시 자식에서 오버라이딩해야 한다.
(왜 오버라이딩이어야 하는지는 오버라이딩할 수 있는 조건을 생각해 보자.)
2. 추상 클래스 만들기
먼저 아래의 소스 코드는 동물에 대해 정의한 클래스이다.
package com;
//추상화 클래스
public abstract class Abstract_Class {
// 동물 클래스
int name;
int cate; //
abstract void sound();
}
class Dog extends Abstract_Class {
@Override
void sound() {
// TODO Auto-generated method stub
System.out.println("댕댕");
}
}
부모의 클래스는 동물에 대한 개념이며, 자식 클래스는 동물을 상속받은 강아지 클래스이다.
먼저 부모 클래스의 선언을 보면 abstract 라는 예약어가 보인다.
abstract 는 [추상] 이라는 뜻으로 abstract 클래스를 붙이면 추상 클래스로 선언된다.
public abstract class Abstract_Class {
부모 클래스의 메소드를 보면 메소드 반환형 앞에 abstract 가 붙은 것을 볼 수 있다. 이를 추상 메소드라 한다.
abstract void sound();
메소드의 형태를 보면 이름은 있지만 메소드의 기능이 전혀 정의되지 않은 것을 확인할 수 있다.
즉, 이름(개념) 만 존재하며 실체는 없다.
마지막 자식 클래스를 보면 부모에서 상속받은 추상 메소드를 오버라이딩하여 기능을 정리한 것을 확인할 수 있다.
@Override
void sound() {
System.out.println("댕댕");
}