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

7-1.상속(상속)

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

상속은 이미 잘 개발된 클래슀λ₯Ό μž¬μ‚¬μš©ν•΄μ„œ μƒˆλ‘œμš΄ 클래슀λ₯Ό λ§Œλ“€κΈ° λ•Œλ¬Έμ— μ€‘λ³΅λ˜λŠ” μ½”λ“œλ₯Ό 쀄여 μ€€λ‹€.

 

예λ₯Ό λ“€μ–΄, field1, field2, method1(), method2()λ₯Ό κ°€μ§€λŠ” 클래슀λ₯Ό μž‘μ„±ν•œλ‹€κ³  κ°€μ •ν•΄λ³΄μž. field1κ³Ό method1()을 κ°€μ§€κ³  μžˆλŠ” ν΄λž˜μŠ€κ°€ μžˆλ‹€λ©΄, 4개λ₯Ό λͺ¨λ‘ μ²˜μŒλΆ€ν„° μž‘μ„±ν•˜λŠ” κ²ƒλ³΄λ‹€λŠ” 클래슀λ₯Ό μƒμ†ν•˜κ³ , field2와 method2()만 μΆ”κ°€ μž‘μ„±ν•˜λŠ” 것이 보닀 효율적이고 개발 μ‹œκ°„μ„ μ ˆμ•½ν•΄μ€€λ‹€.

 

 

클래슀 상속

ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μžμ‹μ΄ λΆ€λͺ¨λ₯Ό μ„ νƒν•œλ‹€. μžμ‹ 클래슀λ₯Ό μ„ μ–Έν•  λ•Œ μ–΄λ–€ λΆ€λͺ¨ 클래슀λ₯Ό 상속받을 것인지 κ²°μ •ν•˜κ³ , μ„ νƒλœ λΆ€λͺ¨ ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같이 extends 뒀에 κΈ°μˆ ν•œλ‹€.

 

class μžμ‹ν΄λž˜μŠ€ extends λΆ€λͺ¨ν΄λž˜μŠ€ {

  //ν•„λ“œ

  //μƒμ„±μž

  //λ©”μ†Œλ“œ

}

 

*μžλ°”μ—μ„œ μƒμ†μ˜ νŠΉμ„±

1. μ—¬λŸ¬ 개의 λΆ€λͺ¨ 클래슀λ₯Ό 상속할 수 μ—†λ‹€. κ·ΈλŸ¬λ―€λ‘œ extends λ’€μ—λŠ” 단 ν•˜λ‚˜μ˜ λΆ€λͺ¨ 클래슀만 와야 ν•œλ‹€.

2. λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ private μ ‘κ·Ό μ œν•œμ„ κ°–λŠ” ν•„λ“œμ™€ λ©”μ†Œλ“œλŠ” 상속 λŒ€μƒμ—μ„œ μ œμ™Έλœλ‹€. 그리고 λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ μžμ‹ ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μ‘΄μž¬ν•œλ‹€λ©΄ default μ ‘κ·Ό μ œν•œμ„ κ°–λŠ” ν•„λ“œμ™€ λ©”μ†Œλ“œλ„ 상속 λŒ€μƒμ—μ„œ μ œμ™Έλœλ‹€.

 

λΆ€λͺ¨ μƒμ„±μž 호좜

ν˜„μ‹€μ—μ„œ λΆ€λͺ¨ μ—†λŠ” μžμ‹μ΄ μžˆμ„ 수 없듯이 μžλ°”μ—μ„œλ„ μžμ‹ 객체λ₯Ό μƒμ„±ν•˜λ©΄, λΆ€λͺ¨ 객체가 λ¨Όμ € μƒμ„±λ˜κ³  κ·Έλ‹€μŒμ— μžμ‹ 객체가 μƒμ„±λœλ‹€.

λΆ€λͺ¨ μƒμ„±μžλŠ” μžμ‹ μƒμ„±μžμ— μˆ¨μ–΄ μžˆλ‹€. λΆ€λͺ¨ μƒμ„±μžλŠ” μžμ‹ μƒμ„±μžμ˜ 맨 첫 μ€„μ—μ„œ ν˜ΈμΆœλœλ‹€.

 

ex)

λΆ€λͺ¨ 클래슀

public class People {

  public String name;

  public String ssn;

 

  public People(String name, String ssn) {

    this.name = name;

    this.ssn = ssn;

  }

}

 

μžμ‹ 클래슀

public class Student extends People {

  public int studentNo;

 

  public Student(String name, String ssn, int studentNo) {

    super(name, ssn);  --> λΆ€λͺ¨ μƒμ„±μž 호좜

    this.studentNo = studentNo;

  }

}

 

μžμ‹ 객체 이용

pubic class StudentExample {

  public static void main(String[] args) {

    Student student = new Student("홍길동", "12345", 1);

    System.out.println("name: " + student.name);

    System.out.println("ssn: " + student.ssn);

    System.out.println("studentNo: " + student.studentNo);

  }

}

 

 

*λΆ€λͺ¨ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμœΌλ©΄ "Implicit super constructor λΆ€λͺ¨ν΄λž˜μŠ€ is undefined. Must explicitly invoke another constructor"λΌλŠ” 컴파일 μ—λŸ¬κ°€ λ°œμƒ

 

λ©”μ†Œλ“œ μž¬μ •μ˜ (overiding)

λΆ€λͺ¨ 클래슀의 λͺ¨λ“  λ©”μ†Œλ“œκ°€ μžμ‹ ν΄λž˜μŠ€μ— 맞게 μ„€κ³„λ˜μ–΄ μžˆλ‹€λ©΄ κ°€μž₯ 이상적인 μƒμ†μ΄μ§€λ§Œ, μ–΄λ–€ λ©”μ†Œλ“œλŠ” μžμ‹ ν΄λž˜μŠ€κ°€ μ‚¬μš©ν•˜κΈ°μ— μ ν•©ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. 이 경우 μƒμ†λœ 일뢀 λ©”μ†Œλ“œλŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ‹€μ‹œ μˆ˜μ •ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. μžλ°”λŠ” 이런 경우λ₯Ό λ©”μ†Œλ“œ μž¬μ •μ˜ 즉, μ˜€λ²„λΌμ΄λ”©μ΄λΌκ³  ν•œλ‹€.

 

*λ©”μ†Œλ“œ μž¬μ •μ˜ 방법

  • λΆ€λͺ¨μ˜ λ©”μ†Œλ“œμ™€ λ™μΌν•œ μ‹œκ·Έλ„ˆμ²˜(리턴 νƒ€μž…, λ©”μ†Œλ“œ 이름, 맀개 λ³€μˆ˜ λͺ©λ‘)λ₯Ό κ°€μ Έμ•Ό ν•œλ‹€.
  • μ ‘κ·Ό μ œν•œμ„ 더 κ°•ν•˜κ²Œ μž¬μ •μ˜ν•  수 μ—†λ‹€.
  • μƒˆλ‘œμš΄ μ˜ˆμ™Έ(Exception)λ₯Ό throwsν•  수 μ—†λ‹€.

λΆ€λͺ¨ λ©”μ†Œλ“œ 호좜

μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜κ²Œ 되면, λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλŠ” μˆ¨κ²¨μ§€κ³  μž¬μ •μ˜λœ μžμ‹ λ©”μ†Œλ“œλ§Œ μ‚¬μš©λœλ‹€. κ·ΈλŸ¬λ‚˜ μžμ‹ 클래슀 λ‚΄λΆ€μ—μ„œ μž¬μ •μ˜λœ λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜λŠ” 상황이 λ°œμƒν•œλ‹€λ©΄ λͺ…μ‹œμ μœΌλ‘œ super ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ„œ λΆ€λͺ¨ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.

 

ex)

super.λΆ€λͺ¨λ©”μ†Œλ“œ();

 

final ν΄λž˜μŠ€μ™€ final λ©”μ†Œλ“œ

final ν‚€μ›Œλ“œλŠ” 클래슀, ν•„λ“œ, λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•  λ•Œ μ‚¬μš©ν•  수 μžˆλŠ”λ°, ν•΄λ‹Ή 선언이 μ΅œμ’… μƒνƒœμ΄κ³  κ²°μ½” μˆ˜μ •λ  수 μ—†μŒμ„ λœ»ν•œλ‹€.

 

ν΄λž˜μŠ€μ™€ λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•  λ•Œ final ν‚€μ›Œλ“œκ°€ μ§€μ •λ˜λ©΄ 상속과 관련이 μžˆλ‹€λŠ” 의미

 

상속할 수 μ—†λŠ” final 클래슀

클래슀λ₯Ό μ„ μ–Έ ν•  λ•Œ final ν‚€μ›Œλ“œλ₯Ό class μ•žμ— 뢙이면 이 ν΄λž˜μŠ€λŠ” μ΅œμ’…μ μΈ ν΄λž˜μŠ€μ΄λ―€λ‘œ 상속할 수 μ—†λŠ” ν΄λž˜μŠ€κ°€ λœλ‹€.

 

ex)

public final class 클래슀 {...} -> 상속 λΆˆκ°€

 

μž¬μ •μ˜ν•  수 μ—†λŠ” final λ©”μ†Œλ“œ

λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•  λ•Œ final ν‚€μ›Œλ“œλ₯Ό 뢙이면 이 λ©”μ†Œλ“œλŠ” μ΅œμ’…μ μΈ λ©”μ†Œλ“œμ΄λ―€λ‘œ μž¬μ •μ˜ν•  수 μ—†λŠ” λ©”μ†Œλ“œκ°€ λœλ‹€.

 

ex)

public final λ¦¬ν„΄νƒ€μž… λ©”μ†Œλ“œ(λ§€κ°œλ³€μˆ˜) {...} -> μ˜€λ²„λΌμ΄λ”© λΆˆκ°€

 

protected μ ‘κ·Ό μ œν•œμž

protectedλŠ” publicκ³Ό default μ ‘κ·Ό μ œν•œμ˜ 쀑간쯀에 ν•΄λ‹Ήν•œλ‹€. 같은 νŒ¨ν‚€μ§€μ—μ„œλŠ” default와 같이 μ ‘κ·Ό μ œν•œμ΄ μ—†μ§€λ§Œ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œλŠ” μžμ‹ 클래슀만 접근을 ν—ˆμš©ν•œλ‹€.

 

λ‹€λ₯Έ νŒ¨ν‚€μ§€ μžˆμ„ λ•Œ

ex)

 

import sec01.exam07.pack1.A;

 

public class D extends A {

  public D(){

    super();   --> μ΄λ ‡κ²Œ ν•΄μ„œ μ ‘κ·Ό κ°€λŠ₯

    this.field = "value";

    this.method();

  }

}

λŒ“κΈ€