Day 14(21.09.23) - Gomserker/Java-101 GitHub Wiki
21. μμ(Inheritance)
(1) μμμ΄λ?
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμμ μμμ΄λ κ°λ
μ λΆλͺ¨ ν΄λμ€μ λ©€λ²(field, method)λ₯Ό μμ ν΄λμ€μκ² λ¬Όλ €μ£Όλ κ²μ λ»νλ€.
μ’ λ μ΄ν΄νκΈ° μ½κ² μκΈ°νλ©΄, μλμ°¨ μμ₯μλ ν¬λ, νλΌλ¦¬, λ²€μΈ λ± λ€μν λ©μ΄μ»€κ° μκ³ λ©μ΄μ»€μ λ°λΌ μ±λ₯κ³Ό μΈνμ μ²μ°¨λ§λ³μ΄λ€. νμ§λ§, κ²°κ΅ μλμ°¨λΌλ ν° μ§ν©μ μμλμ΄ μμΌλ©°, μλμ°¨λΌλ ν° κ°λ
μ΄ κ°μ§λ 곡ν΅μ μΈ μμ±μ λͺ¨λ μλμ°¨ λ©μ΄μ»€κ° 곡ν΅μ μΌλ‘ κ°μ§κ³ μλ€. μ¬κΈ°μ μλμ°¨λΌλ λμ± ν¬κ΄μ μΈ κ°λ
μ λΆλͺ¨ ν΄λμ€, κ·Έλ¦¬κ³ κ° μλμ°¨ λ©μ΄μ»€λ₯Ό μμ ν΄λμ€λΌκ³ μκ°νλ©΄ μ’λ€. μ΄λ¬ν μμμ μ κ°λ°λ ν΄λμ€λ₯Ό μ¬μ¬μ©νμ¬ μλ‘μ΄ ν΄λμ€λ₯Ό λ§λλ κ²μ΄λ―λ‘ μ½λμ μ€λ³΅μ μ€μ¬μ£Όκ³ , λμ± ν¨μ¨μ μΈ κ°λ°μ κ°λ₯νκ² νλ€.
(2) ν΄λμ€ μμ
νμ§λ§ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμμ μμμ νμ€κ³Όλ λ¬λ¦¬ μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€λ₯Ό μ νν μ μλ€. μλ°μμλ μ΄λ΄ λ extendsλΌλ ν€μλλ₯Ό μ¬μ©νλ€. μλ₯Ό λ€μ΄, Porscheμ κ²½μ° μλμ°¨ λ©μ΄μ»€λ‘ μ λͺ νμ§λ§ νλ ν±ν¬μ κ°μ κ²λ€λ λ§λ€μλ λΈλλμ΄λ€. νμ§λ§ μλμ°¨λ₯Ό λ§λ€κ³ μΆλ€ ν λλ μλμ°¨ 곡μ₯μ μΈμ°λ κ²μ²λΌ, μ΄ κ²½μ°μ Tank ν΄λμ€κ° μλ Car ν΄λμ€λ₯Ό μμνλ κ²μ΄λ€.
class Porsche extends Car {
//Field
//Constructor
//Method
}
μ μμμ²λΌ Porcheλ extends ν€μλλ₯Ό μ¬μ©ν΄ Car ν΄λμ€λ₯Ό μμνκ² λ€κ³ μ μΈνλ κ²μ΄λ€. νμ§λ§, νλμ μλμ°¨ 곡μ₯μμ ν±ν¬λ λΉνκΈ°λ₯Ό λ½μλΌ μλ μλ―μ΄(μ€μ λ‘λ κ°λ₯ν μλ μλ€κ³ μ³λ) μλ° μμλ λ€μ€ μμμ νμ©νμ§ μκ³ μλ€. μ¦, extends ν€μλλ₯Ό μ¬μ©ν΄μ Car ν΄λμ€λ₯Ό μμνκ² λ€κ³ μ μΈνλ°λ©΄ Tank, Airplaneκ³Ό κ°μ λΆλͺ¨ ν΄λμ€λ₯Ό μ€λ³΅μΌλ‘ κ°μ§ μ μλ€. μλλ ν΄λμ€ μμμ μμμ΄λ€.
//Porche.java
public class Porsche {
public static void main(String[] args) {
Vehicle normalCar = new Vehicle();
SportsCar carrera = new SportsCar();
normalCar.maxSpeed = 120;
normalCar.name = "Just car";
normalCar.info();
carrera.maxSpeed = 300;
carrera.name = "Carrera";
carrera.cost = 12000;
carrera.info();
}
}
//Vehicle.java
public class Vehicle {
int maxSpeed;
String name;
public void info() {
System.out.println("μ΄λ¦: " + name);
System.out.println("μ΅λ μλ: " + maxSpeed);
}
}
//SportsCar.java
public class SportsCar extends Vehicle{
int cost;
}
Result
μ΄λ¦ : Just car
μ΅λ μλ : 120
μ΄λ¦ : Carrera
μ΅λ μλ : 300
μ μμμμ νμΈν μ μλ―μ΄ SportsCar ν΄λμ€λ λΆλͺ¨ ν΄λμ€μΈ Vehicleμ λͺ¨λ νλμ μμ±μλ₯Ό μ΄μ΄λ°μκΈ° λλ¬Έμ Porsche ν΄λμ€μμ nameκ³Ό maxSpeedμ νλκ°μ μ€μ ν μ μκ³ , info() λ©μλλ₯Ό μ¬μ©ν΄μ μ 보λ₯Ό λΆλ¬μ€κΈ°κΉμ§ ν μ μλ€λ κ²μ νμΈνλ€. νμ§λ§ μ¬κΈ°μ λ¬Έμ κ° μλ€. λΆλͺ SportsCar ν΄λμ€μμλ costλΌλ νλκ°μ νλ μΆκ°νλλ° info() λ©μλμ ν΄λΉ λ΄μ©μ΄ λ°μλμ§ μμλ€. μ΄ λΆλΆμ λ©μλ μ¬μ μ(Method Override)λ₯Ό ν΅ν΄μ ν΄κ²°ν μ μλ€.
(3) λ©μλ μ¬μ μ(Method Override)
λ©μλ μ¬μ μλ λΆλͺ¨ ν΄λμ€μ λ©μλκ° μμ ν΄λμ€μ λ§κ² μ€κ³λμ΄ μμ§ μμ μμ ν΄λμ€μμ μ¬μ©νκΈ° μ΄λ €μΈ κ²½μ°, λ¬Έμ κ·Έλλ‘ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό 'μ¬μ μ(override)'ν¨μΌλ‘μ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μμ ν΄λμ€μ μν©μ λ§κ² μ¬μ©ν μ μκ²λλ€. μ¬κΈ°μ λ©μλλ₯Ό μ¬μ μ νκΈ° μν΄μ '@Override'λΌλ μ΄λ Έν μ΄μ μ μ¬μ©ν΄μΌνλλ°, μμλ μλμ κ°λ€.
//SportsCar.java
public class SportsCar extends Vehicle{
int cost;
@Override //Vehicle ν΄λμ€λ₯Ό μμλ°μ SportsCarμμ λΆλͺ¨ ν΄λμ€μ info() λ©μλλ₯Ό μ¬μ μν΄μ μ¬μ©νκ² λ€κ³ μ μΈ
public void info() {
System.out.println("κ°κ²©: " + cost);
}
}
Result
μ΄λ¦: Just car
μ΅λ μλ: 120
κ°κ²©: 12000
SportsCar ν΄λμ€μμ μ¬μ μ(μ€λ²λΌμ΄λ©)ν info() λ©μλκ° μ λλ‘ μ μ©λ κ²μ νμΈν μ μλ€. νμ§λ§ λ λ€μ λ¬Έμ κ° λ°μνλ€. SportsCarμ νλκ°μΈ μ΄λ¦κ³Ό μ΅λ μλκ° λ³΄μ΄μ§ μκ² λλ€. μ¬κΈ°μ λ©μλ μ¬μ μμ νΉμ§μ νμΈν μ μλλ°, μμ ν΄λμ€μμ λ©μλλ₯Ό μ¬μ μ νκ³ , μμ κ°μ²΄(μ¬κΈ°μ SportsCar)μμ λ©μλλ₯Ό νΈμΆνλ©΄ λΆλͺ¨ λ©μλ(μ¬κΈ°μ Vehicle)κ° νΈμΆλμ§ μκ³ μμ ν΄λμ€μ info() λ©μλλ§ νΈμΆλλ κ²μ μ μ μλ€. μ΄λ κ² λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό νΈμΆν΄μΌνλ μν©μ΄ λ°μν κ²½μ°μ, νλνλ μΆλ ₯ μ½λλ₯Ό μλ‘ μμ±ν μλ μκ² μ§λ§ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό νΈμΆν΄μ μ¬μ©νλ€λ©΄ ν¨μ¬ ν¨μ¨μ μΌλ‘ μμ μ μ§νν μ μκ²λλ€.
(4) super
μ νλͺ©μμ μ€λͺ νλ―, μμ ν΄λμ€μμ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ¬μ μ νκ³ , μμ κ°μ²΄μμ μ¬μ μν λ©μλλ₯Ό νΈμΆν κ²½μ°μ λΆλͺ¨ ν΄λμ€μ λ©μλλ νΈμΆμ΄ λμ§ μλλ€. λΆλͺ¨ ν΄λμ€μ λ©μλκ° νμκ° μμλ λ¬Έμ κ° λμ§ μμ§λ§, μ μμμ κ°μ΄ λΆλͺ¨ ν΄λμ€μ λ©μλκ° μ£Όλ μ 보(μ΄λ¦κ³Ό μ΅λμλ)κ° νμν κ²½μ°μλ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό νΈμΆν΄μΌ νλλ°, μ΄λ΄λ μ¬μ©νλ κ²μ΄ super ν€μλμ΄λ€. superλ₯Ό λͺ μμ μΌλ‘ μ¬μ©ν΄ λΆλͺ¨ ν΄λμ€μ μμ±μμ λ©μλ λ±μ νΈμΆν μ μλ€.(μ΄ νμ΄μ§μμλ λ©μλλ§ νΈμΆνλ€.) μ¬μ©λ²μ μλμ κ°λ€.
//SportsCar.java
public class SportsCar extends Vehicle{
int cost;
@Override //Vehicle ν΄λμ€λ₯Ό μμλ°μ SportsCarμμ λΆλͺ¨ ν΄λμ€μ info() λ©μλλ₯Ό μ¬μ μν΄μ μ¬μ©νκ² λ€κ³ μ μΈ
public void info() {
super.info(); //superν€μλλ‘ λΆλͺ¨ ν΄λμ€λ₯Ό νΈμΆν λ€μμ λ· μ°μ°μ(.)λ‘ infoλ©μλλ₯Ό νΈμΆ
System.out.println("κ°κ²©: " + cost);
}
}
Result
μ΄λ¦: κ·Έλ₯ μ°¨
μ΅λ μλ: 120
μ΄λ¦: Carrera
μ΅λ μλ: 300
κ°κ²©: 12000
super ν€μλλ₯Ό μ¬μ©ν λ€μμ λΆλͺ¨ ν΄λμ€μ info λ©μλλ₯Ό νΈμΆν κ²°κ³Ό μλνλ λλ‘ μ΄λ¦κ³Ό μ΅λ μλ, κ·Έλ¦¬κ³ κ°κ²©μ΄ μΆλ ₯λ κ²μ νμΈν μ μλ€.