개발 지식, 슀크립트/Java 문법

7-3상속(좔상 클래슀)

μ‹œνλ¦¬ν‹°μ§€ν˜Έ 2023. 10. 9. 19:50

객체λ₯Ό 직접 생성할 수 μžˆλŠ” 클래슀λ₯Ό 싀체 클래슀라고 ν•œλ‹€λ©΄ 이 ν΄λž˜μŠ€λ“€μ˜ 곡톡적인 νŠΉμ„±μ„ μΆ”μΆœν•΄μ„œ μ„ μ–Έν•œ 클래슀λ₯Ό 좔상 클래슀라고 ν•œλ‹€.

 

*좔상 ν΄λž˜μŠ€κ°€ λΆ€λͺ¨, 싀체 ν΄λž˜μŠ€κ°€ μžμ‹μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄ 싀체 ν΄λž˜μŠ€λŠ” 좔상 클래슀의 λͺ¨λ“  νŠΉμ„±μ„ λ¬Όλ €λ°›κ³ , 좔가적인 νŠΉμ„±μ„ κ°€μ§ˆ 수 μžˆλ‹€. μ—¬κΈ°μ„œ νŠΉμ„±μ΄λž€ ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό λ§ν•œλ‹€.

 

좔상 클래슀의 μš©λ„

 

1. κ³΅ν†΅λœ ν•„λ“œμ™€ λ©”μ†Œλ“œμ˜ 이름을 톡일할 λͺ©μ 

싀체 클래슀λ₯Ό μ„€κ³„ν•˜λŠ” μ‚¬λžŒμ΄ μ—¬λŸ¬ μ‚¬λžŒμΌ 경우, 싀체 ν΄λž˜μŠ€λ§ˆλ‹€ ν•„λ“œμ™€ λ©”μ†Œλ“œκ°€ 제각기 λ‹€λ₯Έ 이름을 κ°€μ§ˆ 수 μžˆλ‹€.

 

2. 싀체 클래슀λ₯Ό μž‘μ„±ν•  λ•Œ μ‹œκ°„ μ ˆμ•½

곡톡적인 ν•„λ“œμ™€ λ©”μ†Œλ“œλŠ” 좔상 클래슀인 Phone에 λͺ¨λ‘ 선언해두고, λ‹€λ₯Έ 점만 싀체 ν΄λž˜μŠ€μ— μ„ μ–Έν•˜λ©΄ 싀체 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 데 μ‹œκ°„μ„ μ ˆμ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

좔상 클래슀 μ„ μ–Έ

좔상 클래슀λ₯Ό μ„ μ–Έν•  λ•Œμ—λŠ” 클래슀 선언에 abstract ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ•Ό ν•œλ‹€. abstractλ₯Ό 뢙이면 new μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄μ„œ 객체λ₯Ό λ§Œλ“€μ§€ λͺ»ν•˜κ³ , 상속을 톡해 μžμ‹ 클래슀만 λ§Œλ“€ 수 μžˆλ‹€.

 

ex)

public abstract class 클래슀 {

  //ν•„λ“œ

  //μƒμ„±μž

  //λ©”μ†Œλ“œ

}

-> 좔상 ν΄λž˜μŠ€λ„ 일반 ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν•„λ“œ, μƒμ„±μž, λ©”μ†Œλ“œ 선언을 ν•  수 μžˆλ‹€. new μ—°μ‚°μžλ‘œ 직접 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ μžμ‹ 객체가 생성될 λ•Œ super()λ₯Ό ν˜ΈμΆœν•΄μ„œ 좔상 클래슀 객체λ₯Ό μƒμ„±ν•˜λ―€λ‘œ 좔상 ν΄λž˜μŠ€λ„ μƒμ„±μžκ°€ λ°˜λ“œμ‹œ μžˆμ–΄μ•Ό ν•œλ‹€.

 

ex)

좔상 클래슀

 

public abstract class Phone {

  //ν•„λ“œ

  public String owner;

 

  //μƒμ„±μž

  public Phone(String owner) {

    this.owner = owner;

  }

 

  //λ©”μ†Œλ“œ

  public void turnOn() {

    System.out.println("폰 전원을 μΌ­λ‹ˆλ‹€.");

  }

 

  public void turnOff() {

    System.out.println("폰 전원을 λ•λ‹ˆλ‹€.");

  }

}

 

싀체 클래슀

public class SmartPhone extends Phone {

   //μƒμ„±μž

  public SmartPhone(String owner) {

    super(owner);

  }

 

  //λ©”μ†Œλ“œ

  public void internetSearch() {

        System.out.println("인터넷 검색을 ν•©λ‹ˆλ‹€.");

  }

}

 

μ‹€ν–‰ 클래슀

public class PhoneExample {

  public static void main(String[] args) {

    //Phone phone = new Phone();

 

    SmartPhone smartphone = new SmartPhone("홍길동");

 

    smartPhone.turnOn();

    smartPhone.internetSearch();

    smartPhone.turnOff();

  }

}

 

좔상 λ©”μ†Œλ“œμ™€ μž¬μ •μ˜

좔상 ν΄λž˜μŠ€λŠ” 싀체 ν΄λž˜μŠ€κ°€ κ³΅ν†΅μ μœΌλ‘œ κ°€μ Έμ•Ό ν•  ν•„λ“œμ™€ λ©”μ†Œλ“œλ“€μ„ μ •μ˜ν•΄λ†“μ€ 좔상적인 클래슀둜, 싀체 클래슀의 멀버(ν•„λ“œ, λ©”μ†Œλ“œ)λ₯Ό ν†΅μΌν•˜λŠ” 데 λͺ©μ μ΄ μžˆλ‹€.

 

ν•˜μ§€λ§Œ λ©”μ†Œλ“œμ˜ μ„ μ–Έλ§Œ ν†΅μΌν•˜κ³ , μ‹€ν–‰ λ‚΄μš©μ€ 싀체 ν΄λž˜μŠ€λ§ˆλ‹€ 달라야 ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λͺ¨λ“  동물은 μ†Œλ¦¬λ₯Ό λ‚΄κΈ° λ•Œλ¬Έμ— Animal 좔상 ν΄λž˜μŠ€μ—μ„œ sound()λΌλŠ” λ©”μ†Œλ“œλ₯Ό μ •μ˜ν–ˆλ‹€κ³  κ°€μ •ν•˜μž. κ·Έλ ‡λ‹€λ©΄ μ–΄λ–€ μ†Œλ¦¬λ₯Ό 내도둝 ν•΄μ•Ό ν•˜λŠ”λ°, 이것은 싀체 ν΄λž˜μŠ€μ—μ„œ 직접 μž‘μ„±ν•΄μ•Ό ν•œλ‹€. μ™œλƒν•˜λ©΄ 동물은 λ‹€μ–‘ν•œ μ†Œλ¦¬λ₯Ό λ‚΄λ―€λ‘œ 이것을 좔상 ν΄λž˜μŠ€μ—μ„œ ν†΅μΌμ μœΌλ‘œ μž‘μ„±ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έλ ‡λ‹€κ³  ν•΄μ„œ sound() λ©”μ†Œλ“œλ₯Ό 싀체 ν΄λž˜μŠ€μ—μ„œ μž‘μ„±ν•˜λ„λ‘ ν•˜λ©΄ sound() λ©”μ†Œλ“œλ₯Ό μžŠμ–΄λ²„λ¦¬κ³  μž‘μ„±ν•˜μ§€ μ•Šμ„ 경우 동물은 μ†Œλ¦¬λ₯Ό λ‚Έλ‹€λŠ” 것에 μœ„λ°°λœλ‹€.

 

이런 경우λ₯Ό μœ„ν•΄μ„œ 좔상 ν΄λž˜μŠ€λŠ” 좔상 λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•  수 μžˆλ‹€.

 

좔상 λ©”μ†Œλ“œ

abstract ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ λ©”μ†Œλ“œμ˜ μ„ μ–ΈλΆ€λ§Œ 있고 λ©”μ†Œλ“œ μ‹€ν–‰ λ‚΄μš©μΈ μ€‘κ΄„ν˜Έ {}κ°€ μ—†λŠ” λ©”μ†Œλ“œλ₯Ό λ§ν•œλ‹€.

 

ex)

[public | protected] abstract λ¦¬ν„΄νƒ€μž… λ©”μ†Œλ“œμ΄λ¦„(λ§€κ°œλ³€μˆ˜, ...);

 

μ΄λ ‡κ²Œ 좔상 클래슀 섀계 μ‹œ ν•˜μœ„ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ μ‹€ν–‰ λ‚΄μš©μ„ μ±„μš°λ„λ‘ κ°•μ œν•˜κ³  싢은 λ©”μ†Œλ“œκ°€ μžˆμ„ 경우 ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό 좔상 λ©”μ†Œλ“œλ‘œ μ„ μ–Έν•œλ‹€.

 

ex)

public abstract class Animal {

  public abstract void sound();

}

 

-> μ΄λ ‡κ²Œ ν•˜λ©΄ Animal 클래슀λ₯Ό μƒμ†ν•˜λŠ” ν•˜μœ„ ν΄λž˜μŠ€λŠ” λ™λ¬Όλ§ˆλ‹€ κ³ μœ ν•œ μ†Œλ¦¬λ₯Ό 내도둝 sound() λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•΄μ•Ό ν•œλ‹€.