추상 클래스


 - 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 하는 반면, 이 실체 클래스들의 공통적인 속성(필드와 메소드)만 뽑아내어 선언한 클래스를 추상 클래스라 한다.


 - 추상 클래스는 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();

}

}



+ Recent posts