πŸ“‚ JAVA/μ£Όμš” κ°œλ…

ν˜•λ³€ν™˜(μΊμŠ€νŒ…, Casting) - μ—…μΊμŠ€νŒ…(Up-Casting), λ‹€μš΄μΊμŠ€νŒ…(Down-Casting)

Amenable 2023. 5. 24. 22:40

1. ν˜•λ³€ν™˜(μΊμŠ€νŒ…) κ°œλ… 🦏

  ν˜•λ³€ν™˜(μΊμŠ€νŒ…)μ΄λž€ λ³€μˆ˜ λ˜λŠ” μƒμˆ˜μ˜ νƒ€μž…μ„ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것을 λ§ν•œλ‹€.

  κΈ°λ³Έν˜•(Primitive Type)μ—μ„œλŠ” boolean을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ νƒ€μž…λ“€μ€ μ„œλ‘œ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.

  μ°Έμ‘°ν˜•(Reference Type)μ—μ„œλŠ” μ„œλ‘œ 상속관계가 μžˆλŠ” 클래슀 μ‚¬μ΄μ—μ„œλ§Œ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€. μžμ†νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό μ‘°μƒνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ, μ‘°μƒνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό μžμ†νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ ν˜•λ³€ν™˜μ„ ν•˜λŠ” κ²ƒμ΄λ‹€.

  이 κΈ€μ—μ„œλŠ” κΈ°λ³Έν˜•μ˜ ν˜•λ³€ν™˜λ³΄λ‹€λŠ” μ°Έμ‘°ν˜•μ˜ ν˜•λ³€ν™˜μ— μ΄ˆμ μ„ λ§žμΆ”λ„λ‘ ν•œλ‹€.

 

  μ°Έμ‘°ν˜• μΊμŠ€νŒ…μ€ 2κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

1. μ—…μΊμŠ€νŒ…(Up-Casting)

  • μžμ†νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό μ‘°μƒνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” 것
  • μ—…μΊμŠ€νŒ…μ„ ν•˜λ©΄ μƒμ†λ°›μ€ μ„œλΈŒ ν΄λž˜μŠ€μ— μƒκ΄€μ—†μ΄ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ¬Άμ–΄μ„œ κ΄€λ¦¬ν•  μˆ˜ μžˆλ‹€. (Lion, Tiger, Bearλ₯Ό λͺ¨λ‘ Animal둜 λ¬Άμ„ μˆ˜ μžˆλ‹€.)
class Animal { }

class Lion extends Animal { }

class Tiger extends Animal { }

class Bear extends Animal { }

public static void main(String[] args) {
    Animal animal1 = new Lion();
    Animal animal2 = new Tiger();
    Animal animal3 = new Bear();

    List<Animal> animals = new ArrayList<>();
    animals.add(animal1);
    animals.add(animal2);
    animals.add(animal3);
}

2. λ‹€μš΄μΊμŠ€νŒ…(Down-Casting)

  • μ‘°μƒνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό μžμ†νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” 것
  • λ‹€μš΄μΊμŠ€νŒ…μ„ ν†΅ν•΄ μ—…μΊμŠ€νŒ…λœ μžμ‹ ν΄λž˜μŠ€λ₯Ό λ³΅κ΅¬ν•˜μ—¬ λ³ΈμΈμ˜ ν•„λ“œμ™€ κΈ°λŠ₯을 λͺ¨λ‘ μ‚¬μš©ν•  μˆ˜ μžˆλ‹€. (μ—…μΊμŠ€νŒ…μ΄ λ˜λ©΄ μžμ‹ ν΄λž˜μŠ€μ˜ κ³ μœ  ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  μˆ˜ μ—†κ²Œ λœλ‹€. ν•΄λ‹Ή λ‚΄μš©μ€ λ’€μ—μ„œ μžμ„Ένžˆ μ•Œμ•„λ³΄μž.)

 

2. ν˜•λ³€ν™˜ 방법 및 주의점 πŸƒ

  ν˜•λ³€ν™˜(μΊμŠ€νŒ…)의 방법은 κ°„λ‹¨ν•˜λ‹€. ν˜•λ³€ν™˜ν•˜κ³ μž ν•˜λŠ” λ³€μˆ˜ μ•žμ— λ³€ν™˜ν•˜κ³ μž ν•˜λŠ” νƒ€μž…을 κ΄„ν˜Έμ™€ ν•¨κ»˜ λΆ™μ—¬μ£ΌκΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

public static void main(String[] args) {
    
    Tiger tiger = new Tiger();
    Animal animal = (Animal) tiger;
    Tiger newTiger = (Tiger) animal;
}

  ν˜•λ³€ν™˜μ€ μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 것이지 μΈμŠ€ν„΄μŠ€λ₯Ό λ³€ν™˜ν•˜λŠ” 것은 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ°Έμ‘°λ³€μˆ˜μ˜ ν˜•λ³€ν™˜μ€ μΈμŠ€ν„΄μŠ€μ— μ•„λ¬΄λŸ° 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€. 단지 μ°Έμ‘°λ³€μˆ˜μ˜ ν˜•λ³€ν™˜μ„ ν†΅ν•΄μ„œ, μ°Έμ‘°ν•˜κ³  μžˆλŠ” μΈμŠ€ν„΄μŠ€μ—μ„œ μ‚¬μš©ν•  μˆ˜ μžˆλŠ” λ©€λ²„μ˜ λ²”μœ„(개수)λ₯Ό μ‘°μ ˆν•˜λŠ” κ²ƒλΏμ΄λ‹€.

 

  μ—…μΊμŠ€νŒ…κ³Ό λ‹€μš΄μΊμŠ€νŒ…μ— λŒ€ν•΄μ„œ μžμ„Ένžˆ μ•Œμ•„λ³΄μž.

πŸ“˜ 1. μ—…μΊμŠ€νŒ… (Up-Casting)

  μ—…μΊμŠ€νŒ…(μžμ†νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό μ‘°μƒνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜μ— ν• λ‹Ήν•˜λŠ” 경우)을 ν•˜λŠ” κ²½μš°μ—λŠ” ν˜•λ³€ν™˜μ„ μƒλž΅ν•  수 μžˆλ‹€.

public static void main(String[] args) {

    Tiger tiger = new Tiger();
    // κΈ°μ‘΄
    Animal animal = (Animal) tiger;
    // ν˜• λ³€ν™˜ μƒλž΅
    Animal animal = tiger;
}

  ν˜•λ³€ν™˜μ„ μƒλž΅ν•  수 μžˆλŠ” μ΄μœ λŠ” μ°Έμ‘°λ³€μˆ˜κ°€ λ‹€λ£° 수 μžˆλŠ” λ©€λ²„μ˜ κ°œμˆ˜κ°€ μ‹€μ œ μΈμŠ€ν„΄μŠ€κ°€ κ°–κ³  μžˆλŠ” λ©€λ²„μ˜ κ°œμˆ˜λ³΄λ‹€ 적을 것이 λΆ„λͺ…ν•˜λ―€λ‘œ λ¬Έμ œκ°€ λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. μ—…μΊμŠ€νŒ…μ—μ„œλŠ” λ‹€μŒ 2κ°€μ§€λ₯Ό μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

1. μ—…μΊμŠ€νŒ…μ„ ν•˜λ©΄ 멀버 κ°œμˆ˜κ°€ μ œν•œλ˜μ–΄ μžμ‹ ν΄λž˜μŠ€μ—μ„œλ§Œ μžˆλŠ” λ©€λ²„λŠ” μ‚¬μš©ν•  수 μ—†κ²Œ λœλ‹€.

  μ—…μΊμŠ€νŒ…μ„ ν•˜κ²Œ 되면 λΆ€λͺ¨ 클래슀 λ©€λ²„λ‘œ 멀버 κ°œμˆ˜κ°€ ν•œμ •λ˜κΈ° λ•Œλ¬Έμ— μžμ‹ 클래슀 내에 μžˆλŠ” λͺ¨λ“  멀버에 μ ‘κ·Όν•  수 μ—†κ²Œ λœλ‹€. 

public static void main(String[] args) {
    
    SportsCar sportsCar = new SportsCar();
    sportsCar.fastDrive();
    sportsCar.sportsMode = true;

    Car car = sportsCar;
    car.fastDrive(); // μ‚¬μš©λΆˆκ°€
    car.sportsMode = true; // μ‚¬μš©λΆˆκ°€
}

class Car {
    String color;
    int door;
    void drive() {
        System.out.println("drive~~~");
    }
    void stop() {
        System.out.println("stop!!!");
    }
}

class SportsCar extends Car {

    boolean sportsMode = false;

    @Override
    void drive() {
        System.out.println("sports car drive~~~");
    }
    void fastDrive() {
        System.out.println("fast drive~~!");
    }
}

class Ambulance extends Car {
    void siren() {
        System.out.println("siren~~~");
    }
}

2. μ—…μΊμŠ€νŒ… ν–ˆμ§€λ§Œ μ˜€λ²„λΌμ΄λ”© 된 λ©”μ„œλ“œλŠ” μžμ‹ 클래슀의 λ©”μ„œλ“œλ‘œ 싀행이 λœλ‹€.

public static void main(String[] args) {

    SportsCar sportsCar = new SportsCar();
    Car car = sportsCar;
    car.drive(); // sprots car drive~~~
}

πŸ“˜ 2. λ‹€μš΄μΊμŠ€νŒ… (Down-Casting)

  λ‹€μš΄μΊμŠ€νŒ…(μ‘°μƒνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό μžμ†νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ ν• λ‹Ήν•˜λŠ” 경우)을 ν•˜λŠ” κ²½μš°μ—λŠ” ν˜•λ³€ν™˜μ„ μƒλž΅ν•  수 μ—†λ‹€.

public static void main(String[] args) {

    Ambulance ambulance = new Ambulance();
    Car car = ambulance;

    // ν˜•λ³€ν™˜μ„ λΆ™μ—¬μ•Ό 함
    Ambulance newAmbulance = (Ambulance) car;

    // λ‹€μŒκ³Ό 같이 ν˜•λ³€ν™˜ μƒλž΅ λΆˆκ°€
    Ambulance newAmbulance = car;
}

  λ‹€μš΄μΊμŠ€νŒ…μ„ ν•˜λŠ” κ²½μš°μ—λŠ” μ°Έμ‘°λ³€μˆ˜κ°€ λ‹€λ£° 수 μžˆλŠ” λ©€λ²„μ˜ 개수λ₯Ό λŠ˜λ¦¬λŠ” κ²ƒμ΄λ―€λ‘œ λ¬Έμ œκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— ν˜•λ³€ν™˜μ„ μƒλž΅ν•  μˆ˜ μ—†λ‹€.

 

  λ‹€μš΄μΊμŠ€νŒ…μ—μ„œμ˜ μ£Όμ˜μ μ€ 'λ‹¨μˆœνžˆ μ—…μΊμŠ€νŒ…μ˜ λ°˜λŒ€ κ°œλ…μ΄ μ•„λ‹ˆλ‹€'λΌλŠ” 것이닀. λ‹€μš΄ μΊμŠ€νŒ…μ€ λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œ μ—… μΊμŠ€νŒ…λœ μžμ‹ ν΄λž˜μŠ€λ₯Ό λ³΅κ΅¬ν•˜μ—¬ λ³ΈμΈμ˜ ν•„λ“œμ™€ κΈ°λŠ₯을 νšŒλ³΅ν•˜κΈ° μœ„ν•΄ μžˆλŠ” κ²ƒμ΄λ‹€.

public static void main(String[] args) {

    // 잘λͺ»λœ 경우
    Car car = new Car();
    Ambulance ambulance = (Ambulance) car; // ClassCastException

    // μ•Œλ§žμ€ 경우
    Ambulance ambulance = new Ambulance();
    Car car = ambulance;
    Ambulance newAmbulance = (Ambulance) car;
}

  즉, μ‘°μƒνƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μžμ†νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μ°Έμ‘°ν•˜λŠ” 것은 ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€.

 

  κ·Έλž˜μ„œ instanceof μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ μ°Έμ‘°λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜κ³  μžˆλŠ” μΈμŠ€ν„΄μŠ€μ˜ μ‹€μ œ νƒ€μž…μ„ 확인할 수 μžˆλ‹€.

public static void main(String[] args) {
    SportsCar sportsCar = new SportsCar();
    Ambulance ambulance = new Ambulance();

    Car car1 = sportsCar;
    Car car2 = ambulance;
    doWork(car1); // fast drive~~!
    doWork(car2); // siren~~~
}

public static void doWork(Car car) {
    if(car instanceof SportsCar){
        SportsCar sportsCar = (SportsCar) car;
        sportsCar.fastDrive();
    }
    else if( car instanceof Ambulance) {
        Ambulance ambulance = (Ambulance) car;
        ambulance.siren();
    }
}

 

3. μ°Έμ‘°λ³€μˆ˜ ν˜•λ³€ν™˜μ˜ μ£Όμš” μ‹€ν–‰ κ³Όμ • 🦨

  λ§ˆμ§€λ§‰μœΌλ‘œ μ—…μΊμŠ€νŒ…κ³Ό λ‹€μš΄μΊμŠ€νŒ…μ˜ 싀행과정을 κ·Έλ¦Όκ³Ό ν•¨κ»˜ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜μž. (μ•„μ£Ό κ°„λ‹¨ν•œ λ‚΄μš©μ΄λΌμ„œ μ„€λͺ…은 μƒλž΅ν•œλ‹€.)

  주석에 ν•΄λ‹Ήν•˜λŠ” 상황(상황 1, 상황 2, 상황 3)κ³Ό 그림을 λ§€μΉ­μ‹œμΌœμ„œ 보도둝 ν•˜μž.

class Car {
    String color;
    int door;
    void drive() {
        System.out.println("drive~~~");
    }
    void stop() {
        System.out.println("stop!!!");
    }
}

class Ambulance extends Car {
    void siren() {
        System.out.println("siren~~~");
    }
}

public static void main(String[] args) {
    // 상황 1
    Ambulance ambulance1 = new Ambulance();
    Car car = null;
    Ambulance ambulance2 = null;

    // 상황 2
    car = ambulance1;

    // 상황 3
    ambulance2 = (Ambulance) car;

}

상황 1

상황 2

상황 3

 

ν•΄λ‹Ή 글은
남ꢁ성 λ‹˜μ˜ 'μžλ°”μ˜ 정석',
Inpa λ‹˜μ˜ 'JAVA μ—…μΊμŠ€νŒ… & λ‹€μš΄μΊμŠ€νŒ… - μ™„λ²½ μ΄ν•΄ν•˜κΈ°'
λ₯Ό μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.