안녕! 이전 수업에서 우리는 이미 상속의 개념에 대해 간략하게 알게 되었습니다. 오늘 우리는 이 주제를 다시 다룰 것입니다. 하지만 너무 깊지는 않습니다. 앞으로도 이에 대한 자세한 강의를 하도록 하겠습니다. 오늘 우리는 몇 가지 실용적인 예를 간단히 살펴보고 Java의 흥미로운 연산자를 알게 될 것입니다.
상속은 기존 클래스를 기반으로 새 클래스를 선언할 수 있는 프로그래밍 메커니즘(Java 포함)입니다. 그런 다음 파생 클래스는 부모 클래스의 필드 및 메서드에 대한 액세스 권한을 얻습니다. 왜 이것이 필요할까요? 자, 프로그램에서 트럭, RaceCar, Sedan, Pickup 등 여러 자동차 클래스를 생성해야 한다고 상상해 보십시오. 코드를 작성하기 전에도 이 모든 클래스가 공통점이 많다는 것을 확실히 알 수 있습니다. 모든 자동차에는 모델이 있습니다. 이름, 제조 연도, 엔진 크기, 최대 속도 등 (모두 바퀴와 기타 부품이 공통적이라는 사실은 말할 것도 없습니다). 이 상황에서 다음을 수행할 수 있습니다.
a
계승
그렇다면 상속이란 무엇입니까?
- 각 클래스에서 이러한 필드를 만듭니다(새 자동차 클래스를 만들 때 각각 추가).
- 모든 자동차에 공통되는 필드를
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 연산자
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
반환합니다 . 클래스 는 클래스 에서 파생됩니다 . 모든 트럭은 공통 상위인 클래스를 기반으로 생성됩니다 . 연산자가 어떻게 사용되는지 자세히 살펴보십시오 . 메서드("클래스의 개체 인스턴스")가 아니라 연산자이기 때문에 마침표 없이 작성합니다. 다른 방법을 시도해 보겠습니다. Truck
Truck
Car
Car
instanceof
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;
}
String
를 전달된 개체와 비교하기 전에 메서드는 개체가 문자열인지 여부를 테스트합니다. 그런 다음에야 두 개체의 속성을 비교하기 시작합니다. 이 테스트가 존재하지 않는 경우 값 및 길이 필드가 있는 개체를 메서드에 전달하고 문자열과 비교할 수 있습니다. 물론 이는 잘못된 것입니다.
더 읽어보기: |
---|
GO TO FULL VERSION