λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

8-2상속(νƒ€μž… λ³€ν™˜κ³Ό λ‹€ν˜•μ„±)

μ‹œνλ¦¬ν‹°μ§€ν˜Έ 2023. 10. 11.

μΈν„°νŽ˜μ΄μŠ€μ˜ λ‹€ν˜•μ„±

ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•  λ•Œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•΄μ„œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ„λ‘ μ½”λ”©ν–ˆλ‹€λ©΄, κ΅¬ν˜„ 객체λ₯Ό 맀우 손쉽고 λΉ λ₯΄κ²Œ ꡐ체할 수 μžˆλ‹€.

 

μžλ™ νƒ€μž… λ³€ν™˜

κ΅¬ν˜„ 객체가 μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ˜λŠ” 것은 μžλ™ νƒ€μž… λ³€ν™˜μ— ν•΄λ‹Ήν•œλ‹€. μžλ™ νƒ€μž… λ³€ν™˜μ€ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 도쀑에 μžλ™μ μœΌλ‘œ νƒ€μž… λ³€ν™˜μ΄ μΌμ–΄λ‚˜λŠ” 것을 λ§ν•œλ‹€.

 

ex) μΈν„°νŽ˜μ΄μŠ€ λ³€μˆ˜ = κ΅¬ν˜„κ°μ²΄;

 

*μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„ 클래슀λ₯Ό μƒμ†ν•΄μ„œ μžμ‹ 클래슀λ₯Ό λ§Œλ“€μ—ˆλ‹€λ©΄ μžμ‹ 객체 μ—­μ‹œ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ μžλ™ νƒ€μž… λ³€ν™˜ν•  수 μžˆλ‹€. ν•„λ“œμ™€ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ μ„ μ–Έν•˜λ©΄ λ‹€μ–‘ν•œ κ΅¬ν˜„ 객체λ₯Ό λŒ€μž…ν•΄μ„œ μ‹€ν–‰κ²°κ³Όλ₯Ό λ‹€μ–‘ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

 

ν•„λ“œμ˜ λ‹€ν˜•μ„±

 

ex)

# μΈν„°νŽ˜μ΄μŠ€

 

public interface Tire {

  public void roll();

}

 

#κ΅¬ν˜„ 클래슀

 

public class HankookTire implements Tire {

  @Override

  public void roll() {

    System.out.println("ν•œκ΅­ 타이거가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.")

  }

}

 

#κ΅¬ν˜„ 클래슀

 

public class KumhoTire implements Tire {

  @Override

  public void roll() {

    System.out.println("금호 타이거가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.")

  }

}

 

#ν•„λ“œ λ‹€ν˜•μ„±

 

public class Car {

  Tire frontLeftTire = new HankookTire();

  Tire frontRightTire = new HankookTire();

  Tire backLeftTire = new HankookTire();

  Tire bakcRightTire = new HankookTire();

 

 

void run() {

    frontLeftTire.roll();

    frontRightTire.roll();

    bakcLeftTire.roll();

    backRightTire.roll();

  }

}

 

#ν•„λ“œ λ‹€ν˜•μ„±

 

public class CarExample {

  public static void main(String[] args) {

    Car myCar = new Car();

    

    myCar.run();

 

    myCar.frontLeftTire = new KumhoTire();

    myCar.frontRightTire = new KumhoTire();

 

    myCar.run();

  }

 

--> κ²°κ³Ό

 

ν•œκ΅­ 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.

ν•œκ΅­ 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.

ν•œκ΅­ 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.

ν•œκ΅­ 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.

금호 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.

금호 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.

ν•œκ΅­ 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.

ν•œκ΅­ 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.

 

맀개 λ³€μˆ˜μ˜ λ‹€ν˜•μ„±

맀개 λ³€μˆ˜μ˜ νƒ€μž…μ΄ μΈν„°νŽ˜μ΄μŠ€μΌ 경우 μ–΄λ– ν•œ κ΅¬ν˜„ 객체도 λ§€κ°œκ°’μœΌλ‘œ μ‚¬μš©ν•  수 있고, μ–΄λ–€ κ΅¬ν˜„ 객체가 μ œκ³΅λ˜λŠλƒμ— 따라 λ©”μ†Œλ“œμ˜ μ‹€ν–‰κ²°κ³ΌλŠ” λ‹€μ–‘ν•΄μ§ˆ 수 μžˆλ‹€. 이것이 μΈν„°νŽ˜μ΄μŠ€ 맀개 λ³€μˆ˜μ˜ λ‹€ν˜•μ„±μ΄λ‹€.

 

ex)

#맀개 λ³€μˆ˜μ˜ μΈν„°νŽ˜μ΄μŠ€ν™”

 

public class Driver {

  public void drive(Vehicle vehicle) {

    vehicle.run();

  }

}

 

#μΈν„°νŽ˜μ΄μŠ€

public interace Vehicle{

  public void run();

}

 

#κ΅¬ν˜„ 클래슀

public class Bus implements Vehicle {

  @Overide

  public void run() {

    System.out.println("λ²„μŠ€κ°€ λ‹¬λ¦½λ‹ˆλ‹€.");

  }

}

 

#κ΅¬ν˜„ 클래슀

public class Taxi implements Vehicle {

  @Overide

  public void run() {

    System.out.println("νƒμ‹œκ°€ λ‹¬λ¦½λ‹ˆλ‹€.");

  }

}

 

#맀개 λ³€μˆ˜μ˜ λ‹€ν˜•μ„± ν…ŒμŠ€νŠΈ

 

public class DirverExample {

  public static void main(String[] args) {

    Driver driver = new Driver();

    

    Bus bus = new Bus();

    Taxi taxi = new Taxi();

 

    driver.dirve(bus);

    driver.dirve(taxi);

  }

}

 

 

κ°•μ œ νƒ€μž… λ³€ν™˜

κ΅¬ν˜„ 객체가 μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ μžλ™ νƒ€μž… λ³€ν™˜ν•˜λ©΄, μΈν„°νŽ˜μ΄μŠ€μ— μ„ μ–Έλœ λ©”μ†Œλ“œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€λŠ” μ œμ•½ 사항이 λ”°λ₯Έλ‹€.

 

ν•˜μ§€λ§Œ, κ²½μš°μ— λ”°λΌμ„œλŠ” κ΅¬ν˜„ ν΄λž˜μŠ€μ— μ„ μ–Έλœ ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•  κ²½μš°λ„ λ°œμƒν•œλ‹€. 이 λ•Œ κ°•μ œ νƒ€μž… λ³€ν™˜(casting)을 ν•΄μ„œ λ‹€μ‹œ κ΅¬ν˜„  ν΄λž˜μŠ€ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•œ λ‹€μŒ, κ΅¬ν˜„ 클래슀의 ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

ex) κ΅¬ν˜„ν΄λž˜μŠ€ λ³€μˆ˜ = (κ΅¬ν˜„ 클래슀) μΈν„°νŽ˜μ΄μŠ€λ³€μˆ˜;

 

객체 νƒ€μž… 확인

κ°•μ œ νƒ€μž… λ³€ν™˜μ€ κ΅¬ν˜„ 객체가 μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ˜μ–΄ μžˆλŠ” μƒνƒœμ—μ„œ κ°€λŠ₯ν•˜λ‹€. κ·ΈλŸ¬λ‚˜ μ–΄λ–€ κ΅¬ν˜„ 객체가 λ³€ν™˜λ˜μ–΄ μžˆλŠ”μ§€ μ•Œ 수 μ—†λŠ” μƒνƒœμ—μ„œ λ¬΄μž‘μ • κ°•μ œ νƒ€μž… λ³€ν™˜ν•  경우 ClassCastException이 λ°œμƒν•  μˆ˜λ„ μžˆλ‹€.

 

instanceof μ—°μ‚°μž μ‚¬μš©

 

ex)

#객체 νƒ€μž… 확인

public class Driver {

  public void drive(Vehicle vehicle) {

    if(vehicle instanceof Bus) {

      Bus bus = (Bus) vehicle;

      bus.checkFare();

    }

    vehicle.run();

  }

}

 

μ‹€ν–‰

public class DirverExample {

  public static void main(String[] args) {

    Driver driver = new Driver();

    

    Bus bus = new Bus();

    Taxi taxi = new Taxi();

 

    driver.dirve(bus);

    driver.dirve(taxi);

  }

}

 

μ‹€ν–‰ κ²°κ³Ό 

μŠΉμ°¨μš”κΈˆμ„ μ²΄ν¬ν•©λ‹ˆλ‹€.

λ²„μŠ€κ°€ λ‹¬λ¦½λ‹ˆλ‹€.

νƒμ‹œκ°€ λ‹¬λ¦½λ‹ˆλ‹€.

 

μΈν„°νŽ˜μ΄μŠ€ 상속

μΈν„°νŽ˜μ΄μŠ€λ„ λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속할 수 μžˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λŠ” ν΄λž˜μŠ€μ™€λŠ” 달리 닀쀑 상속을 ν—ˆμš©ν•œλ‹€.

 

ex)

public interface ν•˜μœ„μΈν„°νŽ˜μ΄μŠ€ extends μƒμœ„μΈν„°νŽ˜μ΄μŠ€1, μƒμœ„μΈν„°νŽ˜μ΄μŠ€2 {...}

 

*ν•˜μœ„ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€λŠ” ν•˜μœ„ μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ†Œλ“œλΏλ§Œ μ•„λ‹ˆλΌ μƒμœ„ μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  좔상 λ©”μ†Œλ“œμ— λŒ€ν•œ 싀체 λ©”μ†Œλ“œλ₯Ό κ°€μ§€κ³  μžˆμ–΄μ•Ό ν•œλ‹€.

λŒ“κΈ€