λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/Java

[Java] 상속과 λ©”μ„œλ“œ ν™•μž₯으둜 μ½”λ“œ μž¬μ‚¬μš©μ„± 높이기

by hyebin (Helia) 2025. 5. 12.
λ°˜μ‘ν˜•

 


λͺ©μ°¨

     

    객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ κ°•λ ₯ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜λŠ” “μž¬μ‚¬μš©μ„±κ³Ό ν™•μž₯μ„±”μž…λ‹ˆλ‹€.

    이전에 μž‘μ„±ν•œ μ½”λ“œλ₯Ό μž¬ν™œμš©ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό λ§Œλ“€ 수 μžˆλ‹€λ©΄, 개발 μ‹œκ°„μ„ 크게 단좕할 수 있죠.

    이 κ°œλ…μ„ μ‹€ν˜„ν•  수 있게 ν•΄μ£ΌλŠ” λŒ€ν‘œμ μΈ 도ꡬ가 λ°”λ‘œ 상속(Inheritance) 이죠.

     

    이번 ν¬μŠ€νŒ…μ—μ„œλŠ” 상속을 톡해 클래슀λ₯Ό ν™•μž₯ν•˜λŠ” 방법, 그리고 μ˜€λ²„λ‘œλ”©(Overloading)μ˜€λ²„λ‘œλ”©(Overloading)κ³Ό μ˜€λ²„라이딩(Overriding)을 λΉ„κ΅ν•˜λ©° Javaμ—μ„œ λ©”μ„œλ“œλ₯Ό μ–΄λ–»κ²Œ μœ μ—°ν•˜κ²Œ ν™œμš©ν•˜λŠ”μ§€λ₯Ό ν•¨κ»˜ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.


    πŸ”„ 상속과 super ν‚€μ›Œλ“œ

    상속(Inheritance)μ΄λž€?

    상속은 κΈ°μ‘΄ 클래슀(λΆ€λͺ¨)λ₯Ό λ°”νƒ•μœΌλ‘œ μƒˆλ‘œμš΄ 클래슀(μžμ‹)λ₯Ό λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€.

    λΆ€λͺ¨ 클래슀의 ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€κ°€ κ·ΈλŒ€λ‘œ 물렀받을 수 μžˆμ–΄μš”!

    // λΆ€λͺ¨ 클래슀
    public class Animal {
        void sound() {
            System.out.println("동물이 μ†Œλ¦¬λ₯Ό λƒ…λ‹ˆλ‹€.");
        }
    }
    
    // μžμ‹ 클래슀
    public class Dog extends Animal {
        void bark() {
            System.out.println("멍멍!");
        }
    }
    Dog dog = new Dog();
    dog.sound(); // λΆ€λͺ¨ λ©”μ„œλ“œ 호좜 κ°€λŠ₯
    dog.bark();  // μžμ‹ λ©”μ„œλ“œ

     

    πŸ’‘ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ 상속을 μ„ μ–Έν•©λ‹ˆλ‹€.

     

     

    μƒμ†μ˜ μž₯점

    • μ½”λ“œ μž¬μ‚¬μš©μ„± 증가
    • μœ μ§€λ³΄μˆ˜ μš©μ΄μ„± ν–₯상
    • ν™•μž₯μ„± 증가

     

    상속 관계 μš©μ–΄

    • λΆ€λͺ¨ 클래슀(Parent class) / 슈퍼 클래슀(Super class) / 기반 클래슀(Base class): 상속을 ν•΄μ£ΌλŠ” 클래슀
    • μžμ‹ 클래슀(Child class) / μ„œλΈŒ 클래슀(Sub class) / νŒŒμƒ 클래슀(Derived class): 상속을 λ°›λŠ” 클래슀
    πŸ“Œ JavaλŠ” 단일 μƒμ†λ§Œ μ§€μ›ν•©λ‹ˆλ‹€. 즉, ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ 클래슀만 상속받을 수 μžˆμŠ΅λ‹ˆλ‹€.

    super ν‚€μ›Œλ“œ

    superλŠ” λΆ€λͺ¨ 클래슀의 멀버에 μ ‘κ·Όν•  λ•Œ μ‚¬μš©ν•˜λŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.

    1. λΆ€λͺ¨ 클래슀의 μƒμ„±μž 호좜

    public class Animal {
        Animal(String name) {
            System.out.println(name + " 생성됨");
        }
    }
    
    public class Cat extends Animal {
        Cat() {
            super("고양이"); // λΆ€λͺ¨ μƒμ„±μž 호좜
        }
    }

    2. λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œ 호좜

    class Parent {
        void hello() {
            System.out.println("λΆ€λͺ¨ 인사");
        }
    }
    
    class Child extends Parent {
        void hello() {
            super.hello(); // λΆ€λͺ¨μ˜ hello 호좜
            System.out.println("μžμ‹ 인사");
        }
    }

    3. λΆ€λͺ¨ 클래슀의 ν•„λ“œ μ°Έμ‘°

    public class Vehicle {
        String brand = "일반 μ°¨λŸ‰";
    }
    
    public class Car extends Vehicle {
        String brand = "μžλ™μ°¨";
        
        void printBrand() {
            System.out.println("μžμ‹ λΈŒλžœλ“œ: " + this.brand);
            System.out.println("λΆ€λͺ¨ λΈŒλžœλ“œ: " + super.brand);
        }
    }

     

    ⚠️ 상속 μ‹œ μ£Όμ˜μ‚¬ν•­


    1. private λ©€λ²„λŠ” μƒμ†λ˜μ§€λ§Œ 직접 μ ‘κ·Ό λΆˆκ°€λŠ₯
    λΆ€λͺ¨ 클래슀의 private λ©€λ²„λŠ” 상속은 λ˜μ§€λ§Œ, μžμ‹ ν΄λž˜μŠ€μ—μ„œ 직접 μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    getter와 setterλ₯Ό 톡해 κ°„μ ‘μ μœΌλ‘œ μ ‘κ·Όν•΄μ•Ό ν•©λ‹ˆλ‹€.

     

    2. μƒμ„±μžλŠ” μƒμ†λ˜μ§€ μ•ŠμŒ

    λΆ€λͺ¨ 클래슀의 μƒμ„±μžλŠ” μƒμ†λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ super()λ₯Ό 톡해 ν˜ΈμΆœμ€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

     

    3. final ν΄λž˜μŠ€λŠ” 상속 λΆˆκ°€

    final둜 μ„ μ–Έλœ ν΄λž˜μŠ€λŠ” 상속할 수 μ—†μŠ΅λ‹ˆλ‹€

     

    4. final λ©”μ„œλ“œλŠ” μ˜€λ²„λΌμ΄λ”© λΆˆκ°€

    final둜 μ„ μ–Έλœ λ©”μ„œλ“œλŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.


    βœ…  μ˜€λ²„λ‘œλ”© vs μ˜€λ²„λΌμ΄λ”©

    μ˜€λ²„λ‘œλ”©(Overloading)

    같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό λ§€κ°œλ³€μˆ˜λ§Œ λ‹€λ₯΄κ²Œ ν•˜μ—¬ μ—¬λŸ¬ 개 μ •μ˜ν•˜λŠ” 것

    → 같은 κΈ°λŠ₯μ΄μ§€λ§Œ μž…λ ₯이 λ‹€λ₯Ό λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

    public class Calculator {
        int add(int a, int b) {
            return a + b;
        }
    
        double add(double a, double b) {
            return a + b;
        }
    
        int add(int a, int b, int c) {
            return a + b + c;
        }
    }

     

    μ˜€λ²„λ‘œλ”©μ˜ νŠΉμ§•

    • 같은 클래슀 λ‚΄μ—μ„œ 이루어짐
    • λ©”μ„œλ“œ 이름이 동일
    • λ§€κ°œλ³€μˆ˜ νƒ€μž…, 개수, μˆœμ„œ 쀑 ν•˜λ‚˜ 이상이 달라야 함
    • λ°˜ν™˜ νƒ€μž…λ§Œ λ‹€λ₯Έ 것은 μ˜€λ²„λ‘œλ”©μ΄ μ•„λ‹˜

    μ˜€λ²„λ‘œλ”©μ˜ μž₯점

    • 직관적인 λ©”μ„œλ“œ 이름 μ‚¬μš© κ°€λŠ₯
    • λ‹€μ–‘ν•œ λ§€κ°œλ³€μˆ˜μ— λŒ€μ‘ν•˜λŠ” λ©”μ„œλ“œλ₯Ό μΌκ΄€λœ μ΄λ¦„μœΌλ‘œ
    • μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„± ν–₯상

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

    λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜λŠ” 것

    → λΆ€λͺ¨μ˜ κΈ°λŠ₯을 κ·ΈλŒ€λ‘œ μ“°μ§€ μ•Šκ³  μžμ‹μ΄ λ‹€λ₯΄κ²Œ κ΅¬ν˜„ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

    class Animal {
        void sound() {
            System.out.println("동물 μ†Œλ¦¬");
        }
    }
    
    class Dog extends Animal {
        @Override
        void sound() {
            System.out.println("멍멍!");
        }
    }

     

    πŸ“Œ @Override μ–΄λ…Έν…Œμ΄μ…˜μ€ ν•„μˆ˜λŠ” μ•„λ‹ˆμ§€λ§Œ, μ˜€λ²„λΌμ΄λ”© λ©”μ„œλ“œμž„μ„ λͺ…ν™•νžˆ ν•˜κ³  μ‹€μˆ˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

     

    μ˜€λ²„λΌμ΄λ”©μ˜ νŠΉμ§•

    • 상속 κ΄€κ³„μ—μ„œ 이루어짐
    • λ©”μ„œλ“œ 이름, λ§€κ°œλ³€μˆ˜, λ°˜ν™˜ νƒ€μž…μ΄ λͺ¨λ‘ 동일해야 함
    • μ ‘κ·Ό μ œμ–΄μžλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€λ³΄λ‹€ 더 μ œν•œμ μ΄λ©΄ μ•ˆ 됨
    • μ˜ˆμ™ΈλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€λ³΄λ‹€ 더 많이 λ˜μ§€λ©΄ μ•ˆ 됨

    μ˜€λ²„λ‘œλ”© vs μ˜€λ²„λΌμ΄λ”© 비ꡐ

    ν•­λͺ© μ˜€λ²„λ‘œλ”©(Overloading) μ˜€λ²„λΌμ΄λ”©(Overriding)
    μ •μ˜ μœ„μΉ˜ 같은 클래슀 λ‚΄ 상속 κ΄€κ³„μ˜ 클래슀 κ°„
    λ©”μ„œλ“œ 이름 동일 동일
    λ§€κ°œλ³€μˆ˜ νƒ€μž…, 개수, μˆœμ„œ 쀑 ν•˜λ‚˜ 이상 달라야 함 동일해야 함
    λ°˜ν™˜ νƒ€μž… λ‹€λ₯Ό 수 있음 동일해야 함 (Java 5λΆ€ν„° 곡변 λ°˜ν™˜ νƒ€μž… ν—ˆμš©)
    μ ‘κ·Ό μ œμ–΄μž 무관 λΆ€λͺ¨ ν΄λž˜μŠ€λ³΄λ‹€ 더 μ œν•œμ μ΄λ©΄ μ•ˆ 됨
    λͺ©μ  λ‹€μ–‘ν•œ λ§€κ°œλ³€μˆ˜μ— λŒ€μ‘ 상속받은 λ©”μ„œλ“œμ˜ μž¬μ •μ˜

    πŸ™Œ 마무리

    μ˜€λŠ˜μ€ Java의 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ€‘μš”ν•œ κ°œλ…μΈ 상속과 λ©”μ„œλ“œ ν™•μž₯(μ˜€λ²„λ‘œλ”©, μ˜€λ²„λΌμ΄λ”©)에 λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

     

    상속은 κΈ°μ‘΄ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜κ³  ν™•μž₯ν•˜μ—¬ 개발 νš¨μœ¨μ„±μ„ λ†’μ΄λŠ” κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€.

    super ν‚€μ›Œλ“œλ₯Ό 톡해 λΆ€λͺ¨ 클래슀의 멀버에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    μ˜€λ²„λ‘œλ”©μ€ 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό λ‹€μ–‘ν•œ λ§€κ°œλ³€μˆ˜λ‘œ μ •μ˜ν•˜μ—¬ μ½”λ“œμ˜ 일관성과 가독성을 높이고, μ˜€λ²„λΌμ΄λ”©μ€ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜μ—¬ λ‹€ν˜•μ„±μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

     

    μ΄λŸ¬ν•œ κ°œλ…λ“€μ€ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심이며, 효율적이고 μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 데 큰 도움이 λ©λ‹ˆλ‹€.

     

    λ‹€μŒ μ‹œκ°„μ—λŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 또 λ‹€λ₯Έ 핡심 κ°œλ…μΈ λ‹€ν˜•μ„±(Polymorphism)κ³Ό 좔상화(Abstraction)에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. κΆκΈˆν•œ λ‚΄μš©μ΄λ‚˜ μΆ”κ°€λ‘œ μ•Œκ³  싢은 κ°œλ…μ΄ μžˆλ‹€λ©΄ λŒ“κΈ€λ‘œ λ‚¨κ²¨μ£Όμ„Έμš” 😊

    λ°˜μ‘ν˜•