🧠 Java - 상속, λ‹€ν˜•μ„±, 좔사 클래슀 정보

πŸ“˜ 07-1. 클래슀 상속

βœ… κΈ°λ³Έ 객념

  • 클래슀 상속은 κΈ°μ‘΄ 클래슀(λΆ€λͺ¨ 클래슀)의 ν•„λ“œκ°€ λ˜λŠ” λ©”μ†Œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” 것
  • extends ν‚€μ›Œλ“œ μ‚¬μš©
class Parent {
    void hello() {
        System.out.println("Hello from Parent");
    }
}

class Child extends Parent {
    void hi() {
        System.out.println("Hi from Child");
    }
}

πŸ”’ μ ‘κ·Ό μ œν•œμžμ— λ”°λ₯Έ 상속 κ°€λŠ₯ μ—¬λΆ€

μ ‘κ·Ό μ œν•œμž 같은 νŒ¨ν‚€μ§€ λ‹€λ₯Έ νŒ¨ν‚€μ§€
public βœ… κ°€λŠ₯ βœ… κ°€λŠ₯
protected βœ… κ°€λŠ₯ βœ… κ°€λŠ₯
(default) βœ… κ°€λŠ₯ ❌ λΆˆκ°€λŠ₯
private ❌ λΆˆκ°€λŠ₯ ❌ λΆˆκ°€λŠ₯


예제 문제 - κΈ°λ³Έ 상속

image image image


πŸ‘¨β€πŸ‘©β€πŸ‘§ λΆ€λͺ¨ μƒμ„±μž 호좜

  • μžμ‹ 객체λ₯Ό μƒμ„±ν•˜λ©΄ λΆ€λͺ¨ 객체 λ¨Όμ € 호좜
  • μžμ‹ μƒμ„±μžμ—μ„œ λΆ€λͺ¨ μƒμ„±μžλ₯Ό λͺ…μ‹œν™”: super(...)
class Parent {
    Parent(String msg) {
        System.out.println("Parent μƒμ„±μž: " + msg);
    }
}

class Child extends Parent {
    Child() {
        super("λΆ€λͺ¨μ—κ²Œ 전달할 λ©”μ‹œμ§€");
        System.out.println("Child μƒμ„±μž");
    }
}

λΆ€λͺ¨μ— κΈ°λ³Έ μƒμ„±μžκ°€ μ—†κ³  λ©”κ°€λ²ˆμˆ˜ μƒμ„±μžλ§Œ μžˆλŠ” 경우:

class Parent {
    Parent(String name) {
        System.out.println("Hello " + name);
    }
}

class Child extends Parent {
    Child(String name) {
        super(name); // λ§ˆμ§€λ§‰μ—μ„œκ°€ μ•„λ‹ˆλΌ 첫 쀄에 μœ„μΉ˜
    }
}

super() vs super.

ꡬ단 μ„€λͺ…
super() λΆ€λͺ¨ 클래슀의 μƒμ„±μž 호좜
super. λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œ/ν•„λ“œ 호좜


super() 예제

image


✏️ λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ“œ & super μ‚¬μš©

class Parent {
    void greet() {
        System.out.println("Hello from Parent");
    }
}

class Child extends Parent {
    @Override
    void greet() {
        super.greet();
        System.out.println("Hello from Child");
    }
}


λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”© 예제

image


<br>
#### super. 예제
![image](https://github.com/user-attachments/assets/701134a6-75fb-4ff2-a930-0dc677772a8f)


<br>
---
## 🧬 07-2. νƒ€μž… λ³€ν™˜κ³Ό λ‹€ν˜•μ„±

### πŸ”„ μžλ™ νƒ€μž… λ³€ν™˜ (Upcasting)

```java
Parent p = new Child();
p.greet();  // μžμ‹μ˜ μ˜€λ²„λΌμ΄λ“œ λ©”μ†Œλ“œ 호좜

πŸ§ͺ ν•„λ“œμ™€ λ©”κ°€λ¦¬λ°”μˆ˜μ˜ λ‹€ν˜•μ„±

class Animal {
    void sound() {
        System.out.println("동물 μ†Œλ¦¬");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("λͺ¬λͺ¬");
    }
}

class Zoo {
    void makeSound(Animal a) {
        a.sound();
    }
}

πŸ” κ°•μ œ νƒ€μž… λ³€ν™˜ (Downcasting)

Animal a = new Dog();

if (a instanceof Dog) {
    Dog d = (Dog) a;
    d.sound();
}

🧱 07-3. 좔사 클래슀

πŸ“Œ 좔사 클래슀의 μš©λ„

  • 곡톡 κΈ°λ³Έ ν˜•νƒœμ™€ κΈ°λŠ₯ μ„€μ •
  • 객체 생성 νŠΉμ •: ❌

✍️ μ„ μ–Έ μ˜ˆμ‹œ

abstract class Animal {
    abstract void sound();
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("μ•Όμ˜΄");
    }
}
Animal a = new Cat(); // O
Animal b = new Animal(); // X

🧐 좔사 λ©”μ†Œλ“œμ˜ μ€‘μš” νŠΉμ§•

  • 좔사 λ©”μ†Œλ“œλŠ” κ΅¬ν˜„λ˜μ§€ μ•Šμ€ λ©”μ†Œλ“œμ΄λ©°, μžμ‹ ν΄λž˜μŠ€μ—μ„œ κ²°κ³Όλ₯Ό κ°€μ§€κ³  κ΅¬ν˜„ λ˜μ–΄μ•Ό ν•œλ‹€.
  • 좔사 ν΄λž˜μŠ€κ°€ μžμ‹μ—κ²Œ κ²°κ³Ό μ œκ³΅μ„ κ±΄μ§€ν•˜κ³ , μžμ‹μ€ μ—¬λŸ¬ 것을 κ²½μš°μ— 따라 λ‹€μ–‘ν•œ λ³€ν™”(λ‹€ν˜•μ„±)λ₯Ό 보여쀄 수 μžˆλ‹€.
  • ν•˜μœ„ ν΄λž˜μŠ€κ°€ 좔사 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ€ 경우, 컴포저 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.
  • 예:
abstract class Machine {
    abstract void operate();
}

class Printer extends Machine {
    @Override
    void operate() {
        System.out.println("Printing...");
    }
}