source

Java에서 'instance of' 연산자는 무엇에 사용됩니까?

factcode 2022. 8. 14. 11:53
반응형

Java에서 'instance of' 연산자는 무엇에 사용됩니까?

예요?instanceof떤떤오 오? ?? ?? ?? ? ? ? ? ?? 거요.

if (source instanceof Button) {
    //...
} else {
    //...
}

하지만 난 하나도 이해가 안 됐어조사를 해봤는데 설명도 없이 예만 들고 나왔어요.

instanceof키워드는 오브젝트(인스턴스)가 특정 유형의 서브타입인지 테스트하기 위해 사용되는 바이너리 연산자입니다.

상상해 보세요:

interface Domestic {}
class Animal {}
class Dog extends Animal implements Domestic {}
class Cat extends Animal implements Domestic {}

해 보세요.dog 오브젝트, 생성Object dog = new Dog() 그럼아니다,아니다,아니다,아니다,아니다,아니다.

dog instanceof Domestic // true - Dog implements Domestic
dog instanceof Animal   // true - Dog extends Animal
dog instanceof Dog      // true - Dog is Dog
dog instanceof Object   // true - Object is the parent type of all objects

,에서는Object animal = new Animal(); ,

animal instanceof Dog // false

Animal은 ★★★★★★★★★★★입니다.Dog'아예'라고 합니다.

그리고.

dog instanceof Cat // does not even compile!

그 이유는Dog서브타입도 슈퍼타입도 아니다.Cat 하지 않습니다.

과 같습니다.dog위는 종류이다Object. . . .건보 . . . . . 、 . . . . 。instanceof런타임 작업이며, 실행 시 개체 유형에 따라 다르게 반응하는 사용 사례에 대해 설명합니다.

: expressionThatIsNull instanceof T입니다.T.

식의 왼쪽이 오른쪽 클래스 이름의 인스턴스인 경우 true를 반환하는 연산자입니다.

이렇게 생각해 보세요.블록에 있는 모든 집들이 같은 청사진으로 지어졌다고 가정해봅시다.집 10채(객체), 청사진 1세트(클래스 정의)

instanceof오브젝트 컬렉션을 가지고 있고 그것이 무엇인지 모를 때 유용한 도구입니다.폼에 컨트롤 컬렉션이 있다고 가정해 보겠습니다.체크 박스가 있는 경우는, 체크 박스의 상태를 읽으려고 합니다만, plain old object에 체크 박스의 상태를 문의할 수 없습니다.대신 각 개체가 확인란인지 확인하고 확인란일 경우 해당 확인란을 선택하고 속성을 확인합니다.

if (obj instanceof Checkbox)
{
    Checkbox cb = (Checkbox)obj;
    boolean state = cb.getState();
}

사이트에서 설명한 바와 같이:

instanceof연산자를 사용하여 객체가 특정 유형인지 테스트할 수 있습니다.

if (objectReference instanceof type)

간단한 예:

String s = "Hello World!"
return s instanceof String;
//result --> true

,, 청의 적용instanceof 변수에서는 false 반환됩니다.

String s = null;
return s instanceof String;
//result --> false

에 '타입'을 할 수 .instanceof...

class Parent {
    public Parent() {}
}

class Child extends Parent {
    public Child() {
        super();
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        System.out.println( child instanceof Parent );
    }
}
//result --> true

도움이 됐으면 좋겠네요!

이 연산자를 사용하여 개체 유형을 확인할 수 있습니다.한다.booleandiscloss.discloss 。

예를들면

package test;

import java.util.Date;
import java.util.Map;
import java.util.HashMap;

public class instanceoftest
{
    public static void main(String args[])
    {
        Map m=new HashMap();
        System.out.println("Returns a boolean value "+(m instanceof Map));
        System.out.println("Returns a boolean value "+(m instanceof HashMap));
        System.out.println("Returns a boolean value "+(m instanceof Object));
        System.out.println("Returns a boolean value "+(m instanceof Date));
    }
} 

출력은 다음과 같습니다.

Returns a boolean value true
Returns a boolean value true
Returns a boolean value true
Returns a boolean value false

ifsource는 입니다.object 「」,instanceof 체크 은 이 가 맞는지 입니다.Button그렇지 않으면.

다른 답변에서 언급되었듯이 표준적인 사용법은instanceof식별자가 보다 구체적인 유형을 참조하고 있는지 여부를 확인합니다.§:

Object someobject = ... some code which gets something that might be a button ...
if (someobject instanceof Button) {
    // then if someobject is in fact a button this block gets executed
} else {
    // otherwise execute this block
}

단, 왼쪽 표현의 유형은 오른쪽 표현의 부모 유형이어야 합니다(JLS 15.20.2Java Puzzler, #50, pp114 참조).예를 들어, 다음과 같이 컴파일 할 수 없습니다.

public class Test {
    public static void main(String [] args) {
        System.out.println(new Test() instanceof String); // will fail to compile
    }
}

다음 메시지와 함께 컴파일되지 않습니다.

Test.java:6: error: inconvertible types
        System.out.println(t instanceof String);
                       ^
  required: String
  found:    Test
1 error

~로Test는 부모 .String하게 컴파일되어 OTOH를 인쇄합니다.false★★★★★★★★★★★★★★★★★★:

public class Test {
    public static void main(String [] args) {
        Object t = new Test();
        // compiles fine since Object is a parent class to String
        System.out.println(t instanceof String); 
    }
}
public class Animal{ float age; }

public class Lion extends Animal { int claws;}

public class Jungle {
    public static void main(String args[]) {

        Animal animal = new Animal(); 
        Animal animal2 = new Lion(); 
        Lion lion = new Lion(); 
        Animal animal3 = new Animal(); 
        Lion lion2 = new Animal();   //won't compile (can't reference super class object with sub class reference variable) 

        if(animal instanceof Lion)  //false

        if(animal2 instanceof Lion)  //true

        if(lion insanceof Lion) //true

        if(animal3 instanceof Animal) //true 

    }
}

대부분의 사람들은 이 질문의 "무엇"을 정확하게 설명했지만, "어떻게"를 정확하게 설명해주지는 않았습니다.

여기 간단한 예가 있습니다.

String s = new String("Hello");
if (s instanceof String) System.out.println("s is instance of String"); // True
if (s instanceof Object) System.out.println("s is instance of Object"); // True
//if (s instanceof StringBuffer) System.out.println("s is instance of StringBuffer"); // Compile error
Object o = (Object)s;
if (o instanceof StringBuffer) System.out.println("o is instance of StringBuffer"); //No error, returns False
else System.out.println("Not an instance of StringBuffer"); // 
if (o instanceof String) System.out.println("o is instance of String"); //True

출력:

s is instance of String
s is instance of Object
Not an instance of StringBuffer
o is instance of String

가 컴파일러와 비교했을 때 sStringBuffer를 사용한 경우의 자세한 내용은 다음 문서를 참조하십시오.

이 명령을 사용하여 개체가 클래스의 인스턴스인지, 하위 클래스의 인스턴스인지, 또는 특정 인터페이스를 구현하는 클래스의 인스턴스인지를 테스트할 수 있습니다.

즉, LHS는 RHS 또는 RHS를 구현하거나 확장하는 클래스의 인스턴스여야 합니다.

그인인 의용? ??? 용??
모든 클래스는 객체를 확장하므로 LHS를 객체에 유형 캐스팅하는 것은 항상 사용자에게 유리하게 작동합니다.

String s = new String("Hello");
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //No compiler error now :)
else System.out.println("Not an instance of StringBuffer");

출력:

Not an instance of StringBuffer

동등성 검사에서 약어로 사용할 수 있습니다.

그래서 이 코드는

if(ob != null && this.getClass() == ob.getClass) {
}

라고 쓸 수 있다

if(ob instanceOf ClassA) {
}
 

instance of 연산자는 개체를 지정된 유형과 비교합니다.이 명령을 사용하여 개체가 클래스의 인스턴스인지, 하위 클래스의 인스턴스인지, 또는 특정 인터페이스를 구현하는 클래스의 인스턴스인지를 테스트할 수 있습니다.

http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

키워드 인스턴스는 특정 객체의 인스턴스를 알고 싶을 때 유용합니다.

예외를 던지고 캐치가 있는 경우 합계 사용자 정의 연산을 수행한 다음 논리(throw 또는 log 등)에 따라 다시 계속한다고 가정합니다.

예: 1) 사용자가 작성한 커스텀 예외 "Invalid"내선번호예외" 로직대로 던집니다.

2) 이제 catch block catch(예외 e)에서 예외 유형이 "Invalid"인 경우 합계 로직을 수행합니다.내선번호예외"

InvalidExtensionsException InvalidException =(InvalidExtensionsException)e;

3) 인스턴스를 체크하지 않고 예외 유형이 Null 포인터 예외일 경우 코드가 끊어집니다.

따라서 논리는 if의 인스턴스 내에 있어야 합니다(예: instance of instance of Invalid내선번호예외){ 무효입니다.내선번호예외 InvalidException =(잘못됨)내선번호예외)e; }

위의 예는 잘못된 코딩 관행입니다. 그러나 이 예는 인스턴스의 사용을 이해하는 데 도움이 됩니다.

가장 좋은 설명은 jls입니다.항상 출처에서 말하는 것을 확인하도록 하세요.거기서 더 좋은 답을 얻을 수 있을 것이다.여기에 몇 가지 부품을 복제합니다.

instanceof 연산자의 RelationalExpression 피연산자 유형은 참조 유형 또는 null 유형이어야 합니다. 그렇지 않으면 컴파일 시간 오류가 발생합니다.

instance of 연산자 뒤에 기재된 ReferenceType이 재현 가능한 참조 유형(44.7)을 나타내지 않는 경우 컴파일 시 오류입니다.

ReferenceType에 대한 RelationalExpression의 캐스트('15.16)가 컴파일 타임에러로서 거부되었을 경우, 관계식의 인스턴스에서도 마찬가지로 컴파일 타임에러가 발생합니다.이러한 상황에서는 표현 인스턴스의 결과가 결코 진실일 수 없습니다.

자바instanceof연산자는 객체가 지정된 유형의 인스턴스(클래스, 서브클래스 또는 인터페이스)인지 테스트하기 위해 사용됩니다.

java의 인스턴스는 type이라고도 합니다.comparison operator인스턴스를 유형과 비교하기 때문입니다.둘 중 하나를 반환한다.true ★★★★★★★★★★★★★★★★★」false ★★★★★★★★★★★★★를 적용하면,instanceof" "가 있는 연산자" null반환됩니다.false.

JEP 305를 포함한 JDK 14+ 에서는, 다음의 「패턴 매칭」도 실행할 수 있습니다.instanceof

패턴은 기본적으로 값이 특정 유형을 가지는지 테스트하고 일치하는 유형을 가지면 값에서 정보를 추출할 수 있습니다.패턴 매칭을 통해 시스템에서 공통 로직을 보다 명확하고 효율적으로 표현할 수 있습니다.즉, 객체에서 컴포넌트를 조건부로 제거할 수 있습니다.

Java 14 이전 버전

if (obj instanceof String) {
    String str = (String) obj; // need to declare and cast again the object
    .. str.contains(..) ..
}else{
     str = ....
}

Java 14 확장 기능

if (!(obj instanceof String str)) {
    .. str.contains(..) .. // no need to declare str object again with casting
} else {
    .. str....
}

타입 체크와 다른 조건을 조합할 수도 있습니다.

if (obj instanceof String str && str.length() > 4) {.. str.contains(..) ..}

「」에서의.instanceofJava 프로그램의 전체 명시적 캐스팅 수를 줄여야 합니다.

PS:instanceOf에만 일치합니다.이 경우 될 수 있습니다.str

instanceof 연산자는 실행 시 개체(listObj)에 있는 요소의 유형을 알 수 없는 경우에도 사용할 수 있습니다.이 경우 연산자 인스턴스를 사용하여 요소 유형을 파악할 수 있으며 요건에 따라 더 진행하면 도움이 됩니다.

예:

   String str = "";
   int a = 0;
   Integer b = null;

    List listObj = new ArrayList<>();
    listObj.add("String");
    listObj.add(100);
    listObj.add(10.5);
    listObj.add(1l);
    
    if (listObj.get(0) instanceof String) {
        System.out.println("String");
        str = (String)listObj.get(0);
    }
    
    if (listObj.get(1) instanceof Integer) {
        System.out.println("Integer");
         a = (int)listObj.get(1);
         b = (Integer)listObj.get(1);
    }
    
    if (listObj.get(2) instanceof Double) {
        System.out.println("Double");
    }
    
    if (listObj.get(3) instanceof Long) {
        System.out.println("Long");
    }

객체에서 취득한 값이 변수에 할당되어 있는 경우,컴파일 시에 특정 타입으로 캐스트 하도록 요구됩니다.

다음 사항을 고려하겠습니다.

int x = (String)listObj.get(0); 

// 위의 예에서 listObj에서 취득한 요소는 String이며 int에 캐스트됩니다.이렇게 하면 컴파일 시간 오류가 해결됩니다.그러나 실행 시 JVM은 ClassCastException을 슬로우합니다.

따라서 유형과 일치하지 않는 변수에 무작위로 값을 할당하는 대신 instanceof 연산자를 사용하여 값을 확인하고 올바른 변수에 할당하여 오류를 방지할 수 있습니다.

class Test48{
public static void main (String args[]){
Object Obj=new Hello();
//Hello obj=new Hello;
System.out.println(Obj instanceof String);
System.out.println(Obj instanceof Hello);
System.out.println(Obj instanceof Object);
Hello h=null;
System.out.println(h instanceof Hello);
System.out.println(h instanceof Object);
}
}  

매우 간단한 코드 예:

If (object1 instanceof Class1) {
   // do something
} else if (object1 instanceof Class2) {
   // do something different
}

여기서 조심해요.위의 예에서 Class1이 Object일 경우 첫 번째 비교는 항상 True가 됩니다.예외와 마찬가지로 위계질서도 중요합니다!

Map을 사용하여 다음 인스턴스에서 더 높은 추상화를 만들 수 있습니다.

private final Map<Class, Consumer<String>> actions = new HashMap<>();

그런 다음 해당 맵에 액션을 추가합니다.

actions.put(String.class, new Consumer<String>() {
        @Override
        public void accept(String s) {
           System.out.println("action for String");       
        }
    };

알 수 없는 유형의 개체가 있는 경우 해당 맵에서 특정 액션을 얻을 수 있습니다.

actions.get(someObject).accept(someObject)

instance of 연산자는 객체가 지정된 유형의 인스턴스인지 여부를 확인하는 데 사용됩니다.(클래스, 서브클래스 또는 인터페이스).

인스턴스 오브는 인스턴스를 유형과 비교하기 때문에 유형 비교 연산자로도 알려져 있습니다.true 또는 false 중 하나를 반환합니다.

class Simple1 {  
public static void main(String args[]) {  
Simple1 s=new Simple1();  
System.out.println(s instanceof Simple1); //true  
}  
}  

값이 null인 변수를 사용하여 instance of operator를 적용하면 false가 반환됩니다.

언급URL : https://stackoverflow.com/questions/7313559/what-is-the-instanceof-operator-used-for-in-java

반응형