programing

클래스 변수와 관련하여 업캐스팅과 다운캐스팅의 차이점은 무엇입니까?

copyandpastes 2022. 8. 30. 23:38
반응형

클래스 변수와 관련하여 업캐스팅과 다운캐스팅의 차이점은 무엇입니까?

클래스 변수와 관련하여 업캐스팅과 다운캐스팅의 차이점은 무엇입니까?

예를 들어 다음 프로그램 클래스에서는 Animal이 하나의 메서드만 포함하지만 Dog 클래스는 두 개의 메서드를 포함합니다. 그러면 Dog 변수를 Animal Variable에 캐스팅하는 방법을 설명합니다.

캐스팅이 끝났다면 어떻게 동물의 변수를 가진 개의 다른 방법을 부를 수 있을까요?

class Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Animal");
    }
}


class Dog extends Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Dog");
    }

    public void callme2()
    {
        System.out.println("In callme2 of Dog");
    }
}

public class UseAnimlas 
{
    public static void main (String [] args) 
    {
        Dog d = new Dog();      
        Animal a = (Animal)d;
        d.callme();
        a.callme();
        ((Dog) a).callme2();
    }
}

업캐스팅은 슈퍼타입으로 캐스팅하고 다운캐스팅은 서브타입으로 캐스팅합니다.하며, 다운캐스팅은 활자체크를 수반하여 check a and a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a를 던질 수 있습니다.ClassCastException.

의 경우, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★Dog Animal왜냐하면DogAnimal일반적으로 두 클래스 사이에 관계가 있을 때마다 업캐스트할 수 있습니다.

다운캐스팅은 다음과 같습니다.

Animal animal = new Dog();
Dog castedDog = (Dog) animal;

기본적으로는 컴파일러에 오브젝트의 런타임 타입을 알고 있다고 하는 것입니다.컴파일러는 변환을 허용하지만 변환이 적절한지 확인하기 위해 런타임 건전성 검사를 삽입합니다.이 경우 캐스트는 실행 시animal는 '아예'입니다.Dog의 「스태틱」이라고 해도,animalAnimal.

다만, 이것을 실시하는 경우는,

Animal animal = new Animal();
Dog notADog = (Dog) animal;

ClassCastException ★★★★★★★★★★★★★★★★★★★★★★★.animal은 " " " 입니다Animal '하다'라고 되어 있어요animal아니다Dog '아예'를 던집니다.ClassCastException.

하려면 , 「Superclass」를 합니다.super.method()또는 업캐스트를 실행해 주세요.

서브클래스의 메서드를 호출하려면 다운캐스트를 실행해야 합니다. 보통 위험성이 .ClassCastException하면, 「 」, 「 」, 「 」를 할 수 .instanceof에 의해, operator 는 operator 의 「유형」을 방지할 수 .ClassCastExceptions:

Animal animal = getAnimal(); // Maybe a Dog? Maybe a Cat? Maybe an Animal?
if (animal instanceof Dog) {
    // Guaranteed to succeed, barring classloader shenanigans
    Dog castedDog = (Dog) animal;
}

다운캐스트는 의 패턴 매칭을 도입한 Java 16부터 보다 간결하게 표현할 수 있습니다.

Animal animal = getAnimal(); // Maybe a Dog? Maybe a Cat? Maybe an Animal?
if (animal instanceof Dog castedDog) {
    // now castedDog is available here as in the example above
}

다운캐스팅 및 업캐스팅은 다음과 같습니다.
여기에 이미지 설명 입력

업캐스트:Sub 클래스를 Super 클래스로 캐스팅하려면 Upcasting(또는 확장)을 사용합니다.자동으로 이루어지므로 명시적으로 아무것도 할 필요가 없습니다.

Downcasting : Super 클래스를 Sub 클래스로 캐스팅하려면 Downcasting(또는 scrowing)을 사용합니다.Java에서는 Downcasting이 직접 가능하지 않으므로 명시적으로 해야 합니다.

Dog d = new Dog();
Animal a = (Animal) d; //Explicitly you have done upcasting. Actually no need, we can directly type cast like Animal a = d; compiler now treat Dog as Animal but still it is Dog even after upcasting
d.callme();
a.callme(); // It calls Dog's method even though we use Animal reference.
((Dog) a).callme2(); // Downcasting: Compiler does know Animal it is, In order to use Dog methods, we have to do typecast explicitly.
// Internally if it is not a Dog object it throws ClassCastException

자동 박스화 vs-

업캐스팅과 다운캐스팅은 Java의 중요한 부분으로, 간단한 구문을 사용하여 복잡한 프로그램을 만들 수 있으며, 다형성이나 다른 오브젝트 그룹화와 같은 큰 이점을 제공합니다.Java는 서브클래스 유형의 오브젝트를 모든 슈퍼클래스 유형의 오브젝트로 취급할 수 있도록 합니다. 이것을 업캐스팅이라고 합니다. 업캐스팅은 자동으로 이루어지지만 다운캐스팅은 프로그래머수동으로 해야 하는데, 저는 그 이유를 설명하기 위해 최선을 다하겠습니다.

업캐스팅과 다운캐스팅은 원형을 한 개에서 다른 것으로 캐스팅하는 것과 같지 않습니다.그래서 프로그래머가 오브젝트 캐스팅을 배우기 시작할 때 많은 혼란을 야기한다고 생각합니다.

다형성: 기본적으로는 Java의 모든 메서드가 가상입니다. 즉, 상속에서 사용되는 메서드가 final 또는 static으로 선언되지 않는해당 메서드를 재정의할 수 있습니다.

는 다음에 볼 수 .getType();객체(개, 애완견, 경찰견) 유형에 따라 작동합니다.

세 마리의 개가 있다고 가정해 봅시다.

  1. 개 - 이것은 슈퍼 클래스입니다.

  2. 애완견 - 애완견은 개를 확장합니다.

  3. 경찰견 - 경찰견이 애완견을 확장합니다.

    public class Dog{ 
       public String getType () {
          System.out.println("NormalDog");
          return "NormalDog";
       }
     }
    
    /**
     * Pet Dog has an extra method dogName()
     */   
    public class PetDog extends Dog{ 
       public String getType () {
          System.out.println("PetDog");
          return "PetDog";
       }
       public String dogName () {
          System.out.println("I don't have Name !!");
          return "NO Name";
       }
     }
    
    /**
     * Police Dog has an extra method secretId()
     */
    public class PoliceDog extends PetDog{
    
     public String secretId() {
        System.out.println("ID");
        return "ID";
     }
    
     public String getType () {
         System.out.println("I am a Police Dog");
         return "Police Dog";
     }
    }
    

Polymorphism : Java의 모든 메서드는 기본적으로 가상입니다.즉, 상속에서 사용되는 메서드가 final 또는 static으로 선언되지 않는 한 해당 메서드를 재정의할 수 있습니다.(설명은 가상 테이블 개념에 속함)

가상 테이블 / 디스패치 테이블 : 객체의 디스패치테이블에는 객체의 동적으로 바인드된 메서드의 주소가 포함됩니다.메서드 호출은 오브젝트의 디스패치테이블에서 메서드의 주소를 취득함으로써 실행됩니다.디스패치 테이블은 같은 클래스에 속하는 모든 오브젝트에 대해 동일하기 때문에 일반적으로 이들 간에 공유됩니다.

public static void main (String[] args) {
      /**
       * Creating the different objects with super class Reference
       */
     Dog obj1 = new Dog();
`         /**
           *  Object of Pet Dog is created with Dog Reference since                
           *  Upcasting is done automatically for us we don't have to worry about it 
           *  
           */
     Dog obj2 = new PetDog();
`         /**
           *  Object of Police Dog is created with Dog Reference since                
           *  Upcasting is done automatically for us we don't have to worry       
           *  about it here even though we are extending PoliceDog with PetDog 
           *  since PetDog is extending Dog Java automatically upcast for us 
           */
      Dog obj3 = new PoliceDog();
}



 obj1.getType();

★★★Normal Dog

  obj2.getType();

★★★Pet Dog

 obj3.getType();

★★★Police Dog

다운캐스트는 프로그래머가 수동으로 수행해야 합니다.

secretID();의 메서드입니다.obj3, 「」입니다.PoliceDog object, 「」, 「」를 하고 있습니다.Dog 내 이며, 이 는 에러를 시킵니다.obj3할 수 없다secretId()방법.이 메서드를 호출하려면 수동으로 obj3를 다운캐스트하여 PoliceDog

  ( (PoliceDog)obj3).secretID();

ID

'이렇게 하다'를 수 있습니다.dogName(); in the method in the method in 。PetDog시킬 필요가 obj2로로 합니다.PetDog는 obj2를 하고 있기 Dog수 .dogName();

  ( (PetDog)obj2).dogName();

★★★★★★★★★★★★★★★★★? 업캐스트는 자동이지만 다운캐스트는 수동이어야 합니까?아, 아, 아, 아, 아, 아, 아, 아, 아, 아. 만약 있고,이 중 이 은 다른 종류입니다.PetDog,PoliceDog투척함으로써 프로세스가 실패합니다.ClassCastException.

따라서 개체를 슈퍼 클래스 유형을 참조한 경우 개체수동으로 다운캐스트해야 합니다.

주의:때합니다.이는, 의 타입으로 에 지나지 않습니다.이 경우, 출력의 메모리주소를 특정의 타입으로 그룹화하는 것에 지나지 않습니다.Dog

이 질문은 꽤 오래전에 한 것으로 알고 있습니다만, 이 질문의 새로운 유저를 위해서입니다.연산자 인스턴스(instance of operator)의 업캐스팅, 다운캐스팅 및 사용에 대한 전체 설명이 포함된 이 문서를 읽어보십시오.

  • 수동으로 업캐스트할 필요가 없습니다.그것은 자동적으로 행해집니다.

    Mammal m = (Mammal)new Cat(); 같다Mammal m = new Cat();

  • 그러나 다운캐스트는 항상 수동으로 수행해야 합니다.

    Cat c1 = new Cat();      
    Animal a = c1;      //automatic upcasting to Animal
    Cat c2 = (Cat) a;    //manual downcasting back to a Cat
    

왜 그렇습니까? 업캐스트는 자동이지만 다운캐스트는 수동이어야 합니까?음, 알다시피, 업캐스트는 실패할 수 없죠.하지만 다른 동물 그룹이 있고 고양이에게 모두 다운캐스트를 시키고 싶다면 이 동물들 중 일부가 실제로 개일 가능성이 있습니다. ClassCastException을 던지면 프로세스가 실패합니다.여기서는 오브젝트가 어떤 클래스의 인스턴스인지 테스트하는 instanceof라고 불리는 유용한 기능을 도입해야 합니다.

 Cat c1 = new Cat();         
    Animal a = c1;       //upcasting to Animal
    if(a instanceof Cat){ // testing if the Animal is a Cat
        System.out.println("It's a Cat! Now i can safely downcast it to a Cat, without a fear of failure.");        
        Cat c2 = (Cat)a;
    }

상세한 것에 대하여는, 이 문서를 참조해 주세요.

업캐스팅에는 이 방법을 사용하는 것이 좋습니다.이 방법은 이해하기 쉽습니다.

/* upcasting problem */
class Animal
{ 
    public void callme()
    {
        System.out.println("In callme of Animal");
    }
}

class Dog extends Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Dog");
    }

    public void callme2()
    {
        System.out.println("In callme2 of Dog");
    }
}

public class Useanimlas 
{
    public static void main (String [] args) 
    {
        Animal animal = new Animal ();
        Dog dog = new Dog();
        Animal ref;
        ref = animal;
        ref.callme();
        ref = dog;
        ref.callme();
    }
}

를 호출하다callme() Parent 클래스 " " " " "Child ★★★★

UPCASTING -->

DOWNCASTING --> 공개

여기에 이미지 설명 입력

여기에 이미지 설명 입력

여기에 이미지 설명 입력

1. - 업캐스트

업캐스팅을 수행할 때 하위 유형의 객체를 가리키는 태그를 정의합니다(유형 및 하위 유형은 더 편한 경우 클래스 및 하위 클래스라고 할 수 있습니다...).

Animal animalCat = new Cat();

이 태그인 animal Cat은 Animal 타입만의 기능(메서드)을 가지고 있습니다.왜냐하면 우리는 그것을 타입 Cat이 아닌 타입 Animal로 선언했기 때문입니다.

우리는 그것을 컴파일 시 또는 런타임에 "자연적/암시적/자동적"으로 할 수 있습니다.주로 Cat은 Animal로부터 그 기능의 일부를 계승하고 있기 때문입니다.(적어도 cat은 동물이죠?

2. - 다운캐스팅

하지만 만약 우리가 동물태그 타입에서 Cat의 기능을 얻어야 한다면 어떻게 될까요?

Cat 객체를 가리키는 animalCat 태그를 작성했기 때문에 animalCat 태그에서 Cat 객체의 메서드를 스마트하게 호출할 수 있는 방법이 필요합니다.

이런 절차를 다운캐스팅이라고 하는데 런타임에만 할 수 있습니다.

일부 코드 시간:

public class Animal {
    public String move() {
        return "Going to somewhere";
    }
}

public class Cat extends Animal{
    public String makeNoise() {
        return "Meow!";
    }   
}

public class Test {

    public static void main(String[] args) {
        
    //1.- Upcasting 
    //  __Type_____tag________object
        Animal animalCat = new Cat();
    //Some animal movement
        System.out.println(animalCat.move());
        //prints "Going to somewhere"
        
    //2.- Downcasting   
    //Now you wanna make some Animal noise.
        //First of all: type Animal hasn't any makeNoise() functionality.
        //But Cat can do it!. I wanna be an Animal Cat now!!
        
        //___________________Downcast__tag_____ Cat's method
        String animalNoise = ( (Cat) animalCat ).makeNoise();
        
        System.out.println(animalNoise);
        //Prints "Meow!", as cats usually done.
        
    //3.- An Animal may be a Cat, but a Dog or a Rhinoceros too.
        //All of them have their own noises and own functionalities.
        //Uncomment below and read the error in the console:
        
    //  __Type_____tag________object
        //Cat catAnimal = new Animal();
        
    }

}

: 차: 차: 차: 차: 차: 차: 차: 차: 차: 차.
: 고고
c1 = Figo c1 = new Figo();

=====
업캐스팅:-
메서드: 클래스 "Figo"가 "new"로 지정되므로 오브젝트 c1은 메서드 오브클래스를 참조합니다(그림 - 메서드는 덮어쓸 필요가 있습니다).
("Car합니다.오브젝트 c1은 선언 클래스의 인스턴스 변수("Car")를 참조합니다.

선언 클래스가 부모이고 개체가 자식에서 생성되면 암묵적인 캐스팅이 발생합니다. 즉, "업캐스트"입니다.

======
하다
= ( //syslog f1 = (그림) c1; //
메서드: 오브젝트 f1은 클래스 "Figo"를 사용하여 초기 오브젝트 c1이 작성되기 때문에 메서드 오브 클래스(그림)를 참조합니다.다만 다운캐스팅이 완료되면 클래스 "Figo"에만 존재하는 메서드도 변수 f1에 의해 참조할 수 있습니다.
c1(c1의 의 선언 합니다.오브젝트 f1은 오브젝트 c1의 선언 클래스의 인스턴스 변수(c1의 선언 클래스는 CAR)를 참조하지 않지만 다운캐스팅에서는 클래스 Figo의 인스턴스 변수를 참조합니다.

======
용도: 객체가 하위 클래스이고 선언 클래스가 상위 클래스이고 하위 클래스가 상위 클래스가 아닌 자체 클래스의 인스턴스 변수에 액세스하려는 경우 "다운캐스트"를 사용하여 수행할 수 있습니다.

업캐스팅이란 객체를 슈퍼타입으로 캐스팅하는 것을 의미하며 다운캐스팅이란 서브타입으로 캐스팅하는 것을 의미합니다.

자바에서는 업캐스팅이 자동으로 이루어지기 때문에 업캐스팅이 필요하지 않습니다.보통 암묵적인 캐스팅이라고 하죠다른 사용자에게 명확하게 하기 위해 지정할 수 있습니다.

그래서 글쓰기

Animal a = (Animal)d;

또는

Animal a = d;

두 경우에서 정확히 동일한 포인트로 이어지며 두 경우 모두 실행된다로 실행해야 할 똑같은 지점과를 가질 수 있다.callme()부터에서Dog..

왜냐하면 다운캐스팅이필요한 이유는 정의 Downcasting 대신 필요하다.a동물의 개체입니다.애니멀의 대상입니다.현재 그현재 알고 있는 것은 알고 있다.Dog하지만 자바 it's.java는보장되지 않습니다를 보장하지 않고 있다.사실 런타임에서는 자바java는 private의 있으면 실제로 런타임에는다를 수를 던질 것이다 다를 수 있다.ClassCastException, 그런 일이 일어났으면.그런 일이 일어날까요?물론, 당신의 표본 사례의 경우는 아니다.물론 그것은 당신의 샘플의 경우는 아닙니다.만약 당신이섭외하지 않으신다면들을 버리지 것a로.Animal왜냐하면 java는어플리케이션을컴파일할 수 없었습니다, 자바도 응용 프로그램 컴파일할 수 없었다.Animal메서드 방법이를 갖고 있지 않없다callme2()..

당신의 예에서 당신이 예에서는,다음의 코드에 도달할수 없습니다의 코드에 도달할 수 없다.callme()의의Animal부터에서UseAnimlas(왜냐하면(왜냐하면Dog지 않는 한 방법은 따를 것을): 덮어쓰다.덮어쓰기)방법은다음과 같습니다.

class Dog extends Animal 
{ 
    public void callme()
    {
        super.callme();
        System.out.println("In callme of Dog");
    }
    ... 
} 

다운캐스팅 객체를 만들 수 있습니다.이런 타입도 있어요.: 기본 클래스 메서드를 호출합니다.

Animal a=new Dog();
a.callme();
((Dog)a).callme2();

언급URL : https://stackoverflow.com/questions/23414090/what-is-the-difference-between-up-casting-and-down-casting-with-respect-to-class

반응형