추상클래스 원리
abstract class Vehicle 클래스 이름 앞에 abstract를 붙인 추상 메소드이다.
{
protected int speed;
public void setSpeed(int s)
{
speed = s;
System.out.println("속도를" + speed + "로 변경되었습니다.");
}
abstract void show(); 이 메소드에는 몸체{}가 없다.
}
이 클래스는 Vehicle이라는 물건을 표현한 클래스이다. 클래스 이름 앞에 abstract라는 제한자가 붙어 있다.
이 클래스를 추상 클래스(abstract class)라고 하며 객체를 생성할 수 없다.
public static void main(String[] args)
}
. . .
Vehicle vc;
// vc = new Vehicle(); 추상 클래스로는 객체를 만들 수 없다.
}
Vehicle 클래스의 show()메소드에는 몸체{}가 없다. 이 처럼 몸체 없는 메소드의 시작 부분에도 abstract라는 키워드를 붙인다.
그러면 추상 메소드가 된다.
구문
abstract class 클래스 이름
}
필드 선언;
abstract 리턴 값의 형(type) 메소드 이름(인수 목록);
}
추상 클래스 사용하기
필요한 이유?
우선, 추상 클래스 Vehicle을 상속받아서 서브 클래스를 만들 수 있다.
그러나 추상 클래스를 상속받은 서브 클래스로 객체를 생성하기 위해서는
추상 클래스의 상속받은 추상 메소드의 몸체를 서브 클래스에서 오버라이딩 해서 구현 하는 작업이 반드시 필요하다.
// 탈것 클래스
abstract class Vehicle 추상 클래스
{
protected int speed;
public void setSpeed(int s)
{
speed = s;
System.out.println("속도를 " + speed + "으로 변경했습니다.");
}
abstract void show(); 추상 메소드 show()
}
// 자동차 클래스
class Car extends Vehicle 추상 메소드 확장
{
private int num;
private double gas;
public Car(int n, double g)
{
num = n;
gas = g;
System.out.println("차량 번호 " + num + " , 연료 양 " + gas + "인 자동차가 만들어졌습니다.");
}
public void show() 부모클래스 show()메소드를 반드시 오버라이딩 몸체를 만들어야한다.
{
System.out.println("차량 번호는 " + num + "입니다.");
System.out.println("연료 양은 " + gas + "입니다.");
System.out.println("속도는 " + speed + "입니다.");
}
}
// 비행기 클래스
class Plane extends Vehicle 추상 클래스 확장
{
private int flight;
public Plane(int f)
{
flight = f;
System.out.println("비행기 번호가 " + flight + "인 비행기가 만들어졌습니다.");
}
public void show() show()메소드의 몸체를 만들었다.
{
System.out.println("비행기 번호는 "+ flight + "입니다.");
System.out.println("속도는 " + speed + "입니다.");
}
}
class Sample1
{
public static void main(String[] args)
{
Vehicle[] vc; 추상클래스 배열
vc = new Vehicle[2];
vc[0] = new Car(1234, 20.5); 첫번째 객체는 Car 클래스
vc[0].setSpeed(60);
vc[1] = new Plane(232); 두번 째 객체는 Plane 클래스
vc[1].setSpeed(500);
,
for(int i=0; i<vc.length; i++){
vc[i].show(); show()메소드 호출
}
}
}
차량 번호 1234 , 연료 양 20.5인 자동차가 만들어졌습니다.
속도를 60으로 변경했습니다.
비행기 번호가 232인 비행기가 만들어졌습니다.
속도를 500으로 변경했습니다.
차량 번호는 1234입니다. 각 객체에 연결된 show()메소드가 호출되었다.
연료 양은 20.5입니다.
속도는 60입니다.
비행기 번호는 232입니다.
속도는 500입니다.
추상메소드를 이용하면 그 서브 클래스를 한곳에 모아 쉽게 제어할 수 있다. 추상 클래스를 사용하면 이해아기 쉬운 코드를 작성가능
instanceof 연산자
추상 클래스를 사용하는 코드를 작성하다 보면 많은 양의 서브 클래스를 다루어야 할 경우가 생긴다. 이러래 편리하게 사용할 수 있는
instance of 연산자가 있다.
instance of연산자는 객체의 클래스를 알아낼 수 있다.
// 탈것 클래스
abstract class Vehicle
{
protected int speed;
public void setSpeed(int s)
{
speed = s;
System.out.println("속도를 " + speed + "으로 변경했습니다.");
}
abstract void show();
}
// 자동차 클래스
class Car extends Vehicle
{
private int num;
private double gas;
public Car(int n, double g)
{
num = n;
gas = g;
System.out.println("차량 번호 " + num + " , 연료 양 " + gas + "인 자동차가 만들어졌습니다.");
}
public void show()
{
System.out.println("차량 번호는 " + num + "입니다.");
System.out.println("연료 양은 " + gas + "입니다.");
System.out.println("속도는 " + speed + "입니다.");
}
}
// 비행기 클래스
class Plane extends Vehicle
{
private int flight;
public Plane(int f)
{
flight = f;
System.out.println("비행기 번호가 " + flight + "인 비행기가 만들어졌습니다.");
}
public void show()
{
System.out.println("비행기 번호는 "+ flight + "입니다.");
System.out.println("속도는 " + speed + "입니다.");
}
}
class Sample2
{
public static void main(String[] args)
{
Vehicle[] vc;
vc = new Vehicle[2];
vc[0] = new Car(1234, 20.5); 첫번째 객체는 Car클래스
vc[1] = new Plane(232); 두번째 객체는 Plane클래스
for(int i = 0; i < vc.length; i++) {
if(vc[i] instanceof Car) 객체가 Car클래스인지 그 진위를 확인
System.out.println((i + 1) + "번째 객체는 Car 클래스 입니다."); 조건이 참 일때 실행
else
System.out.println((i + 1) + "번째 객체는 Car 클래스가 아닙니다."); 조건이 거짓일때 실행
}
}
}
실행 결과
2번째 객체는 Car 클래스가 아닙니다.
비행기 번호가 232인 비행기가 만들어졌습니다.
1번째 객체는 Car 클래스 입니다.
2번째 객체는 Car 클래스가 아닙니다.
특정 클래스의 객체에만 별도의 처리를 해야 할 겨우 이 연산자를 사용하면 편리하다.
'프로그래밍 > java' 카테고리의 다른 글
대규모 프로그램사용(파일분할, 패키지, 임포트) (1197) | 2017.09.08 |
---|---|
인터페이스, 다중상속 (1218) | 2017.09.04 |
상속-2(다형성과 오버라이딩, 캡슐화,super) (1535) | 2017.09.02 |
상속-1 (498) | 2017.09.01 |
클래스 이용 (510) | 2017.08.30 |