πŸ“™ Java

[Java] 상속(Inheritance)

ji_wonna 2022. 9. 6. 13:18

상속

μžλ°”μ—μ„œ μƒμ†μ΄λž€ 기쑴의 클래슀λ₯Ό μž¬ν™œμš©ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 기법이닀.

두 κ°€μ§€μ˜ 클래슀λ₯Ό μƒμœ„ ν΄λž˜μŠ€μ™€ ν•˜μœ„ 클래슀둜 λ‚˜λˆ„μ–΄ μƒμœ„ 클래슀의 멀버(ν•„λ“œ, λ©”μ„œλ“œ, μ΄λ„ˆ 클래슀)λ₯Ό ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ³΅μœ ν•  수 있으며 두 클래슀λ₯Ό 상속 관계에 μžˆλ‹€κ³  ν•œλ‹€.

ν•˜μœ„ ν΄λž˜μŠ€λŠ” μƒμœ„ ν΄λž˜μŠ€λ‘œλΆ€ν„° ν™•μž₯된 κ°œλ…μ΄κΈ° λ•Œλ¬Έμ— ν•˜μœ„ 클래슀의 멀버 κ°œμˆ˜λŠ” μƒμœ„ ν΄λž˜μŠ€λ³΄λ‹€ 항상 λ§Žκ±°λ‚˜ κ°™λ‹€.

클래슀λ₯Ό 상속할 λ•ŒλŠ” extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©°, <ν•˜μœ„ 클래슀λͺ…> extends <μƒμœ„ 클래슀λͺ…> μœΌλ‘œ μ •μ˜ν•œλ‹€.

상속을 μ‚¬μš©ν•˜λ©΄ μƒμœ„ ν΄λž˜μŠ€μ™€ μ€‘λ³΅λ˜λŠ” μ½”λ“œλ₯Ό 쀄일 수 μžˆλ‹€λŠ” 이점을 κ°–λŠ”λ‹€.

μžλ°”μ—μ„œλŠ” 단일 μƒμ†λ§Œμ„ ν—ˆμš©ν•˜λ©° μΈν„°νŽ˜μ΄μŠ€(interface)λΌλŠ” 문법 μš”μ†Œλ₯Ό 톡해 닀쀑 상속과 λΉ„μŠ·ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

 

포함 관계

포함 κ΄€κ³„λŠ” μƒμ†μ²˜λŸΌ 클래슀λ₯Ό μž¬μ‚¬μš©ν•  수 μžˆλŠ” λ°©λ²•μœΌλ‘œ ν•΄λ‹Ή 클래슀의 멀버 λ³€μˆ˜λ‘œ 포함할 λ‹€λ₯Έ 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것을 λ§ν•œλ‹€.

public class Employee {
    int id;
    String name;
    Position position;

    public Employee(int id, String name, Position position) {
        this.id = id;
        this.name = name;
        this.position = position;
    }

    void showInfo() {
        System.out.println(id + " " + name);
        System.out.println(position.team+ " " + position.job);
    }

    public static void main(String[] args) {
        Position position1 = new Position("개발", "νŒ€μž₯");
        Position position2 = new Position("인사", "사원");

        Employee e1 = new Employee(1, "κΉ€μ½”λ”©", position1);
        Employee e2 = new Employee(2, "λ°•μ•ˆλ…•", position2);

        e1.showInfo();
        e2.showInfo();
    }
}

class Position {
    String team, job;

    public Position(String team, String job) {
        this.team = team;
        this.job = job;
    }
}

// Output
1 κΉ€μ½”λ”©
개발 νŒ€μž₯
2 λ°•μ•ˆλ…•
인사 사원

μœ„ μ˜ˆμ‹œλ₯Ό 보면, Employee 클래슀의 멀버 λ³€μˆ˜λ‘œ Position 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜κ°€ μ •μ˜λ˜μ–΄ μžˆλ‹€.

μ›λž˜λŠ” Position 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μΈ teamκ³Ό job을 Employee의 클래슀 λ³€μˆ˜λ‘œ μ„ μ–Έν•΄μ€˜μ•Ό ν•˜μ§€λ§Œ Position 클래슀둜 λ³€μˆ˜λ₯Ό λ¬Άμ–΄μ„œ 선언해쀬닀. μ΄λ ‡κ²Œ 포함 관계λ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ 쀑볡을 쀄일 수 있고 μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

 

포함? 상속?

μ—¬κΈ°κΉŒμ§€ 보면 포함 관계와 상속 κ΄€κ³„λŠ” μœ μ‚¬ν•œ 것 κ°™λ‹€. μ–΄λ–»κ²Œ ν•˜λ©΄ 이 λ‘˜μ„ μ‰½κ²Œ ꡬ뢄 지을 수 μžˆμ„κΉŒ!?

λ‘˜μ˜ 관계가 ~은 ~을 가지고 μžˆλ‹€.(HAS-A)λ©΄ 포함 관계이고 <ν•˜μœ„ 클래슀>λŠ” <μƒμœ„ 클래슀>이닀.(IS-A)λ©΄ 상속 관계라고 μƒκ°ν•˜λ©΄ νŽΈν•˜λ‹€.

포함 : 근둜자(Employee)λŠ” 직급(Position)을 κ°–κ³  μžˆλ‹€.

상속 : 슀포츠카(SportsCar)λŠ” μ°¨(Car)λ‹€.

 

 

λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©(Method Overriding)

λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©μ€ μƒμœ„ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 λ©”μ„œλ“œμ™€ 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λŠ” 것이닀.

μ˜€λ²„λΌμ΄λ”©μ„ μ‚¬μš©ν•  λ•ŒλŠ” λ‹€μŒ μ„Έ 가지 쑰건을 λͺ¨λ‘ λ§Œμ‘±ν•΄μ•Ό ν•œλ‹€.

  1. λ©”μ„œλ“œ 이름, λ§€κ°œλ³€μˆ˜, λ°˜ν™˜ νƒ€μž…μ΄ μƒμœ„ ν΄λž˜μŠ€μ™€ μ™„μ „νžˆ λ˜‘κ°™μ•„μ•Ό ν•œλ‹€.
  2. μ ‘κ·Ό μ œμ–΄μžμ˜ λ²”μœ„κ°€ μƒμœ„ ν΄λž˜μŠ€μ™€ κ°™κ±°λ‚˜ λ„“μ–΄μ•Ό ν•œλ‹€.
  3. μ˜ˆμ™ΈλŠ” μƒμœ„ 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ 많이 μ„ μ–Έν•  수 μ—†λ‹€.

 

 

super와 super()

super ν‚€μ›Œλ“œλŠ” μƒμœ„ 클래슀의 객체λ₯Ό μ˜λ―Έν•œλ‹€.

ν•˜μœ„ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λͺ…κ³Ό 상속받은 μƒμœ„ 클래슀의 λ³€μˆ˜λͺ…이 같을 λ•Œ super.λ³€μˆ˜λͺ… 을 μ‚¬μš©ν•˜λ©΄ μƒμœ„ 클래슀의 λ³€μˆ˜λͺ…에 μ ‘κ·Όν•  수 μžˆλ‹€. λ§Œμ•½ superλ₯Ό 뢙이지 μ•ŠλŠ”λ‹€λ©΄ ν•΄λ‹Ή κ°μ²΄λŠ” μžμ‹ μ΄ μ†ν•œ μΈμŠ€ν„΄μŠ€μ˜ 멀버λ₯Ό μ°Έμ‘°ν•˜κ²Œ λœλ‹€.

super()λŠ” μƒμœ„ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œλ‘œ this()와 λ§ˆμ°¬κ°€μ§€λ‘œ μƒμ„±μž μ•ˆμ—μ„œλ§Œ μ‚¬μš©ν•  수 있으며 첫 쀄에 μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

λ§Œμ•½ super()κ°€ μ—†λŠ” κ²½μš°μ—λŠ” μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μƒμ„±μžμ˜ 첫 쀄에 생성해주고 λ§Œμ•½ μƒμœ„ 클래슀의 κΈ°λ³Έ μƒμ„±μžκ°€ μ—†λŠ” 경우 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. λ”°λΌμ„œ 클래슀λ₯Ό λ§Œλ“€ λ•Œ κΈ°λ³Έ μƒμ„±μžλ₯Ό μž‘μ„±ν•˜λŠ” μŠ΅κ΄€μ„ κ°–λŠ” 게 μ’‹λ‹€.

 

 

Object 클래슀

Object ν΄λž˜μŠ€λŠ” μžλ°” 클래슀 쀑 μ΅œμƒμœ„μ— μœ„μΉ˜ν•œ 클래슀둜 μ»΄νŒŒμΌλŸ¬λŠ” μ•„λ¬΄λŸ° 상속을 받지 μ•ŠλŠ” ν΄λž˜μŠ€μ— μžλ™μœΌλ‘œ extends Objectλ₯Ό μΆ”κ°€ν•˜μ—¬ Object 클래슀λ₯Ό 상속받도둝 ν•΄μ€€λ‹€. λ”°λΌμ„œ λͺ¨λ“  μžλ°” ν΄λž˜μŠ€λŠ” Object 클래슀의 멀버듀을 μ‚¬μš©ν•  수 μžˆλ‹€.

Object 클래슀의 λŒ€ν‘œμ μΈ λ©”μ„œλ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • toString() : λ¬Έμžμ—΄λ‘œ 좜λ ₯
  • equals(Object obj) : ==와 λ™μΌν•œ μ—°μ‚°μœΌλ‘œ μŠ€νƒ λ©”λͺ¨λ¦¬κ°’을 비ꡐ
  • wait() : ν˜„μž¬ μŠ€λ ˆλ“œ μΌμ‹œμ •μ§€
  • notify() : μΌμ‹œμ •μ§€ 쀑인 μŠ€λ ˆλ“œ λ‹€μ‹œ μ‹€ν–‰