본문으로 바로가기

추상 클래스, instanceof 연산자)

category 프로그래밍/java 2017. 9. 3. 21:55

추상클래스 원리

 

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