CodeGym/Java Blog/무작위의/Java의 Instanceof 및 상속
John Squirrels
레벨 41
San Francisco

Java의 Instanceof 및 상속

무작위의 그룹에 게시되었습니다
회원
안녕! 이전 수업에서 우리는 이미 상속의 개념에 대해 간략하게 알게 되었습니다. 오늘 우리는 이 주제를 다시 다룰 것입니다. 하지만 너무 깊지는 않습니다. 앞으로도 이에 대한 자세한 강의를 하도록 하겠습니다. 오늘 우리는 몇 가지 실용적인 예를 간단히 살펴보고 Java의 흥미로운 연산자를 알게 될 것입니다.

계승

그렇다면 상속이란 무엇입니까? instanceof 및 상속 101 - 1 상속은 기존 클래스를 기반으로 새 클래스를 선언할 수 있는 프로그래밍 메커니즘(Java 포함)입니다. 그런 다음 파생 클래스는 부모 클래스의 필드 및 메서드에 대한 액세스 권한을 얻습니다. 왜 이것이 필요할까요? 자, 프로그램에서 트럭, RaceCar, Sedan, Pickup 등 여러 자동차 클래스를 생성해야 한다고 상상해 보십시오. 코드를 작성하기 전에도 이 모든 클래스가 공통점이 많다는 것을 확실히 알 수 있습니다. 모든 자동차에는 모델이 있습니다. 이름, 제조 연도, 엔진 크기, 최대 속도 등 (모두 바퀴와 기타 부품이 공통적이라는 사실은 말할 것도 없습니다). 이 상황에서 다음을 수행할 수 있습니다.
  • 각 클래스에서 이러한 필드를 만듭니다(새 자동차 클래스를 만들 때 각각 추가).
  • 모든 자동차에 공통되는 필드를 Car상위 클래스로 가져온 다음 extends 키워드를 사용하여 클래스에서 특정 유형의 자동차에 대한 모든 클래스를 파생시킵니다 Car.
당연히 두 번째 옵션이 훨씬 더 편리합니다.
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
최소한 우리는 불필요한 코드 중복을 피합니다(그리고 프로그램을 작성할 때 항상 그렇게 하려고 노력해야 합니다). 또한 모든 자동차에 공통된 모든 필드가 하나의 클래스로 통합된 간단하고 이해하기 쉬운 클래스 구조가 있습니다. 트럭에 다른 자동차에는 없는 특수 필드가 있는 경우 클래스에서 선언할 수 있습니다 Truck. 방법도 마찬가지입니다. 모든 자동차에는 메서드로 설명할 수 있는 특정 공통 동작이 있습니다(예: 자동차 시동, 가속/제동 등). 이러한 공통 메서드는 상위 클래스로 통합될 수 있으며 각 Car특정 유형의 자동차는 파생 클래스에서 고유한 작업을 정의할 수 있습니다. .
public class Car {

   public void gas() {
       // Accelerate
   }

   public void brake() {
       // Brake
   }
}


public class F1Car extends Car {

   public void pitStop() {

       // Only race cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
클래스 에 모든 자동차 공통 메서드를 추가했습니다 Car. F1Car그러나 "Formula 1" 경주용 자동차를 나타내는 클래스를 보십시오 . 피트 스탑(긴급 자동차 정비를 위한 정류장)은 레이스에서만 수행되므로 관련 파생 클래스에 이 특정 기능을 추가했습니다. instanceof 및 상속 101 - 2

instanceof 연산자

Java에는 객체가 특정 클래스를 기반으로 생성되었는지 확인하기 위한 특수 연산자 instanceof 가 있습니다 . 검사 결과에 따라 true 또는 false를 반환합니다 . 자동차 예제의 클래스를 사용하여 어떻게 작동하는지 살펴보겠습니다.
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
출력: true 개체가 있고 모든 트럭이 자동차이므로 연산자 는 true 를instanceof 반환합니다 . 클래스 는 클래스 에서 파생됩니다 . 모든 트럭은 공통 상위인 클래스를 기반으로 생성됩니다 . 연산자가 어떻게 사용되는지 자세히 살펴보십시오 . 메서드("클래스의 개체 인스턴스")가 아니라 연산자이기 때문에 마침표 없이 작성합니다. 다른 방법을 시도해 보겠습니다. TruckTruckCarCarinstanceof
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
출력: false 클래스 Car(및 car 개체)가 클래스에서 파생되지 않습니다 Truck. 모든 트럭은 자동차이지만 모든 자동차가 트럭은 아닙니다. Car개체는 클래스를 기반으로 하지 않습니다 Truck. 또 다른 예:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
출력: True 여기서 논리도 간단합니다. 사용자가 생성한 클래스를 포함하여 Java의 모든 클래스는 클래스에서 파생됩니다 Object("extends Object"라고 작성하지 않더라도 이미 암시되어 있음). 이것이 언제 어떻게 유용할까요? 연산자 는 메서드를 instanceof재정의할 때 가장 일반적으로 사용됩니다 equals(). equals예를 들어, 클래스 에서 메소드가 구현되는 방법은 다음과 같습니다 String.
public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
a String를 전달된 개체와 비교하기 전에 메서드는 개체가 문자열인지 여부를 테스트합니다. 그런 다음에야 두 개체의 속성을 비교하기 시작합니다. 이 테스트가 존재하지 않는 경우 길이 필드가 있는 개체를 메서드에 전달하고 문자열과 비교할 수 있습니다. 물론 이는 잘못된 것입니다.
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다