▶ 추상 클래스
- 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 하는 반면, 이 실체 클래스들의 공통적인 속성(필드와 메소드)만 뽑아내어 선언한 클래스를 추상 클래스라 한다.
- 추상 클래스는 new 연산자를 사용하여 객체를 생성할 수 없다.
- 추상 클래스와 실체 클래스는 상속의 관계에 놓여있다.
- 추상 클래스가 부모이고 실체 클래스가 자식으로 구현되며, 실체 클래스는 추상 클래스에 있는 속성 외에 추가적인 속성을 가질 수 있다.
- 추상 클래스는 새로운 실체 클래스를 위한 부모 클래스의 용도로만 사용된다.
▶ 추상 클래스의 장점
- 실체 클래스들의 필드와 메소드를 통일하여 실체 클래스 작성 시 시간을 절약할 수 있다.
▶ 추상 클래스의 선언
public abstract class 클래스명 {
//필드
//생성자
//메소드
}
▶ 추상 메소드와 오버라이딩(Overriding)
- 추상 메소드란 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드를 말한다. 끝에는 항상 세미콜론이 있다.
- 추상 메소드는 추상 클래스에서만 선언할 수 있다.
- 메소드 실행 내용인 중괄호 블록은 추상 메소드를 상속받은 실체 메소드에서 직접 작성한다.
- 반드시 자식 클래스는 추상 메소드를 재정의(Overriding)해서 실행 내용을 작성해야 한다.
- 즉, 추상 클래스를 설계할 때, 하위(자식) 클래스가 반드시 실행해야 하는 메소드를 추상 메소드로 선언하면 된다.
public abstract class Car{
//필드
public int speed;
public String owner;
//생성자
public Car(String owner) {
this.owner = owner;
}
//메소드
public abstract void accelerate(int speed);
public abstract void whatKind();
public void driving() { //모든 자식 객체가 실행하는 메소드
System.out.println("운전 중");
}
}
public class SportCar extends Car{
//필드
int speed;
//생성자
public SportCar(String owner, int speed) {
super(owner);
this.speed = speed;
}
//메소드
@Override
public void accelerate(int speed) {
if(speed > 0) {
this.speed += ( 2 * speed );
}
}
@Override
public void whatKind() {
System.out.println("스포츠카입니다.");
}
}
public class Truck extends Car {
//필드
int speed;
//생성자
public SportCar(String owner, int speed) {
super(owner);
this.speed = speed;
}
//메소드
@Override
public void accelerate(int speed) {
if(speed > 0) {
this.speed += speed;
}
}
@Override
public void whatKind() {
System.out.println("트럭입니다.");
}
}
public class CarTest { //실행 클래스, 객체의 속성을 정의하는 클래스와는 별도로 생성하는 것이 좋다.
public static void main(String[] args) {
SportCar sportCar = new SportCar();
Truck truck = new Truck();
sportCar.whatKind();
truck.whatKind();
sportCar.driving();
truck.driving();
//변수의 자동 타입 변환
Car car = null;
car = new SportCar();
car.whatKind();
car = new Truck();
car.whatKind();
}
}
'Programming Language > JAVA' 카테고리의 다른 글
12. Interface - 인터페이스 (3) | 2017.04.16 |
---|---|
11. Array - 배열 (0) | 2017.04.16 |
9. Extend - 상속 (0) | 2017.04.08 |
8. 클래스의 구성 멤버와 접근 제한자 (0) | 2017.04.08 |
7. Class and Object - 클래스와 객체 (+ 쓰레기 수집) (0) | 2017.04.06 |