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

빈 ꡬ멍 μ±„μš°κΈ°

[Java] μ—…μΊμŠ€νŒ…, λ‹€μš΄μΊμŠ€νŒ…

좜처

ChatGPT


μ—…μΊμŠ€νŒ…κ³Ό λ‹€μš΄μΊμŠ€νŒ…μ€ μžλ°”μ—μ„œ 상속 관계에 μžˆλŠ” 클래슀 간에 객체λ₯Ό μΊμŠ€νŒ…ν•  λ•Œ μ‚¬μš©ν•˜λŠ” κ°œλ…μ΄λ‹€. 두 가지 λͺ¨λ‘ λ‹€ν˜•μ„±(Polymorphism)을 ν™œμš©ν•΄ 객체λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ€‘μš”ν•œ 방법이닀.

 

μ—…μΊμŠ€νŒ… Upcasting

μ—…μΊμŠ€νŒ…μ€ μžμ‹ 클래슀의 객체λ₯Ό λΆ€λͺ¨ 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것을 λ§ν•œλ‹€. μžλ°”μ—μ„œλŠ” λͺ¨λ“  μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀의 νƒ€μž…μ„ 상속받기 λ•Œλ¬Έμ—, λͺ…μ‹œμ μΈ μΊμŠ€νŒ… 없이도 μ—…μΊμŠ€νŒ…μ΄ κ°€λŠ₯ν•˜λ‹€.

 

νŠΉμ§•

  • μžμ‹ 클래슀의 객체가 λΆ€λͺ¨ 클래슀의 νƒ€μž…μœΌλ‘œ λ³€ν™˜λ˜κΈ° λ•Œλ¬Έμ—, λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ •μ˜λœ λ©”μ†Œλ“œλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€.
  • μžμ‹ 클래슀의 λ©”μ†Œλ“œκ°€ μ˜€λ²„λΌμ΄λ”©(μž¬μ •μ˜)된 경우, μ‹€μ œ μ‹€ν–‰ μ‹œμ μ—μ„œλŠ” μžμ‹ 클래슀의 λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλœλ‹€. 이λ₯Ό λŸ°νƒ€μž„ λ‹€ν˜•μ„±μ΄λΌκ³  ν•œλ‹€.

 

μ‚¬μš© 이유

  • λ‹€μ–‘ν•œ μžμ‹ 클래슀λ₯Ό ν•˜λ‚˜μ˜ λΆ€λͺ¨ 클래슀 νƒ€μž…μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆλ‹€.
  • μ½”λ“œμ˜ 일관성 μœ μ§€ 맟 μž¬μ‚¬μš©μ„± 증가

 

μ˜ˆμ‹œ

동물(Animal)μ΄λΌλŠ” μƒμœ„ ν΄λž˜μŠ€μ™€ 이λ₯Ό μƒμ†λ°›λŠ” μ—¬λŸ¬ 동물(예: Dog, Cat) ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  κ°€μ •ν•˜μž. μ—¬λŸ¬ 동물 객체λ₯Ό ν•˜λ‚˜μ˜ 배열에 μ €μž₯ν•˜κ³ , 이듀을 반볡적으둜 μ²˜λ¦¬ν•  λ•Œ μ—…μΊμŠ€νŒ…μ΄ μœ μš©λ‹€.

class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal[] animals = new Animal[2];
        animals[0] = new Dog();  // μ—…μΊμŠ€νŒ…: Dog -> Animal
        animals[1] = new Cat();  // μ—…μΊμŠ€νŒ…: Cat -> Animal
        
        for (Animal animal : animals) {
            animal.makeSound();  // λ‹€ν˜•μ„±: μ‹€μ œ 객체의 λ©”μ†Œλ“œ 호좜
        }
    }
}

 

κ²°κ³Ό

Bark
Meow

 

λ‹€μš΄μΊμŠ€νŒ… Downcasting

λ‹€μš΄μΊμŠ€νŒ…μ€ λΆ€λͺ¨ 클래슀 νƒ€μž…μœΌλ‘œ μ—…μΊμŠ€νŒ…λœ 객체λ₯Ό λ‹€μ‹œ μžμ‹ 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것을 λ§ν•œλ‹€. λ‹€μš΄μΊμŠ€νŒ…μ€ λͺ…μ‹œμ μΈ μΊμŠ€νŒ…μ΄ ν•„μš”ν•˜λ‹€. λ‹€μš΄μΊμŠ€νŒ…μ΄ μ„±κ³΅ν•˜λ €λ©΄, μ‹€μ œ κ°μ²΄λŠ” λ‹€μš΄μΊμŠ€νŒ…λ  νƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€.

 

νŠΉμ§•

  • λ‹€μš΄μΊμŠ€νŒ…μ„ ν•  λ•ŒλŠ” instanceof μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ 객체가 νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€μΈμ§€ ν™•μΈν•˜λŠ” 것이 μ’‹λ‹€.
  • 잘λͺ»λœ λ‹€μš΄μΊμŠ€νŒ… μ‹œ ClassCastException이 λ°œμƒν•  수 μžˆλ‹€.

 

μ‚¬μš© 이유

  • λΆ€λͺ¨ 클래슀 νƒ€μž…μœΌλ‘œ 처리된 객체λ₯Ό λ‹€μ‹œ μžμ‹ 클래슀 νƒ€μž…μœΌλ‘œ 돌렀 μžμ‹ 클래슀의 κ³ μœ ν•œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.
  • νŠΉμ • μƒν™©μ—μ„œ μžμ‹ 클래슀의 고유 κΈ°λŠ₯이 ν•„μš”ν•  λ•Œ μœ μš©ν•˜λ‹€.

 

μ˜ˆμ‹œ

class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
    
    void wagTail() {
        System.out.println("Tail wagging");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();  // μ—…μΊμŠ€νŒ…: Dog -> Animal
        
        animal.makeSound();  // "Bark" 좜λ ₯ (λ‹€ν˜•μ„±)
        
        // λ‹€μš΄μΊμŠ€νŒ… ν›„ Dog 클래슀의 λ©”μ†Œλ“œ 호좜
        if (animal instanceof Dog) {
            Dog dog = (Dog) animal;  // λ‹€μš΄μΊμŠ€νŒ…: Animal -> Dog
            dog.wagTail();           // "Tail wagging" 좜λ ₯
        }
    }
}