Amenable
Amenable's Blog
Amenable
  • λΆ„λ₯˜ 전체보기 (189)
    • πŸ“‚ JAVA (87)
      • μ΄νŽ™ν‹°λΈŒ μžλ°” (65)
      • μ£Όμš” κ°œλ… (22)
    • πŸ“‚ 개발 μ„œμ  (22)
      • μ‹€μš©μ£Όμ˜ ν”„λ‘œκ·Έλž˜λ¨Έ (1)
      • 객체지ν–₯의 사싀과 μ˜€ν•΄ (2)
      • 클린 μ½”λ“œ (8)
      • ν•¨κ»˜ 자라기 (1)
      • 그림으둜 λ°°μš°λŠ” HTTP&Network Basic (10)
    • πŸ“‚ λ°μ΄ν„°λ² μ΄μŠ€ (8)
      • κ°œλ… (8)
      • λ¬Έμ œν’€μ΄ (0)
    • πŸ“‚ λ„€νŠΈμ›Œν¬ (14)
      • κ°œλ… (6)
      • 성곡과 μ‹€νŒ¨λ₯Ό κ²°μ •ν•˜λŠ” 1%의 λ„€νŠΈμ›Œν¬ 원리 (8)
    • πŸ“‚ μŠ€ν”„λ§ (13)
      • κΈ°λ³Έ κ°œλ… (13)
    • πŸ“‚ WEB (5)
    • πŸ“‚ 자료ꡬ쑰 (12)
      • κ°œλ… (2)
      • μ •λ ¬ (8)
      • 트리 (2)
    • πŸ“‚ μ•Œκ³ λ¦¬μ¦˜ (10)
      • μ΅œμ†Œμ‹ μž₯트리 (2)
      • μ΅œλ‹¨ 경둜 (2)
      • λ¬Έμžμ—΄ (2)
      • ETC (4)
    • πŸ“‚ μ•Œκ³ λ¦¬μ¦˜_λ¬Έμ œν’€μ΄ (4)
      • BOJ_λ°±μ€€ (4)
    • πŸ“‚ ν”„λ‘œκ·Έλž˜λ° (3)
    • πŸ“‚ DevOps (2)
      • 배포 (2)
    • πŸ“‚ ν›„κΈ° (8)
      • μš°μ•„ν•œ ν…Œν¬μ½”μŠ€(ν”„λ¦¬μ½”μŠ€) (4)
      • 2023λ…„ (3)
      • 2024λ…„ (1)
    • πŸ“‚ 회고 (1)
      • 2023λ…„ (1)

λΈ”λ‘œκ·Έ 메뉴

  • πŸš€ GitHub

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
Amenable

Amenable's Blog

ν˜•λ³€ν™˜(μΊμŠ€νŒ…, Casting) - μ—…μΊμŠ€νŒ…(Up-Casting), λ‹€μš΄μΊμŠ€νŒ…(Down-Casting)
πŸ“‚ JAVA/μ£Όμš” κ°œλ…

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

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 μ—…μΊμŠ€νŒ… & λ‹€μš΄μΊμŠ€νŒ… - μ™„λ²½ μ΄ν•΄ν•˜κΈ°'
λ₯Ό μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

'πŸ“‚ JAVA > μ£Όμš” κ°œλ…' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

좔상 클래슀(Abstract Class)  (2) 2023.06.11
μ œλ„€λ¦­(Generics) - 곡변(Covariant), λΆˆκ³΅λ³€(Invariant), λ°˜κ³΅λ³€(Contravariant)  (0) 2023.05.29
μ œλ„€λ¦­(Generics) - κΈ°λ³Έ κ°œλ…  (0) 2023.05.13
래퍼 클래슀 (Wrapper Class)  (0) 2023.05.09
clone()  (0) 2023.04.07
    'πŸ“‚ JAVA/μ£Όμš” κ°œλ…' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • 좔상 클래슀(Abstract Class)
    • μ œλ„€λ¦­(Generics) - 곡변(Covariant), λΆˆκ³΅λ³€(Invariant), λ°˜κ³΅λ³€(Contravariant)
    • μ œλ„€λ¦­(Generics) - κΈ°λ³Έ κ°œλ…
    • 래퍼 클래슀 (Wrapper Class)
    Amenable
    Amenable
    CS, μžλ°”, 자료ꡬ쑰, μ•Œκ³ λ¦¬μ¦˜, μŠ€ν”„λ§, μŠ€ν”„λ§ λΆ€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” κ°œλ°œμ— κ΄€ν•œ λ‚΄μš©μ„ κ³΅μœ ν•©λ‹ˆλ‹€.

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”