Java에서 변수 유형을 확인하는 방법은 무엇입니까?


답변:


111

Java는 정적으로 형식화 된 언어이므로 컴파일러가 대부분의 검사를 수행합니다. 변수를 특정 유형으로 선언하면 컴파일러는 해당 유형의 값 (또는 해당 유형의 하위 유형 인 값) 만 할당되도록합니다.

당신이 준 ( int, array, double) 예제 는 모두 원시적이며 하위 유형이 없습니다. 따라서 변수를 다음과 같이 선언하면 int:

int x;

당신은 그것이 int가치를 가질 것이라고 확신 할 수 있습니다 .

List그러나 변수를로 선언 한 경우 변수가의 하위 유형을 보유 할 수 있습니다 List. 이들의 예로는 ArrayList, LinkedList

당신이있는 한 경우 List변수를, 당신은 그것이이었다 알고하는 데 필요한 ArrayList다음 작업을 수행 할 수 있습니다 :

List y;
...
if (y instanceof ArrayList) { 
  ...its and ArrayList...
}

그러나 그렇게해야한다고 생각한다면 접근 방식을 재고 해 보는 것이 좋습니다. 대부분의 경우 객체 지향 원칙을 따르면이 작업을 수행 할 필요가 없습니다. 물론 모든 규칙에는 예외가 있습니다.


3
instanceof 연산자는 변수가 참조하는 객체의 데이터 유형 만 결정합니다. 원래 요청 된대로 실제 VARIABLE의 데이터 유형을 결정하지 않습니다.
GrantRobertson

38

Java의 메소드 과부하 기능을 남용하여 실제로 테스터를 롤링하기가 매우 쉽습니다. SDK에 공식적인 방법이 있는지 여전히 궁금합니다.

예:

class Typetester {
    void printType(byte x) {
        System.out.println(x + " is an byte");
    }
    void printType(int x) {
        System.out.println(x + " is an int");
    }
    void printType(float x) {
        System.out.println(x + " is an float");
    }
    void printType(double x) {
        System.out.println(x + " is an double");
    }
    void printType(char x) {
        System.out.println(x + " is an char");
    }
}

그때:

Typetester t = new Typetester();
t.printType( yourVariable );

21
좋은 방법 IMO가 아닙니다. Typetester 클래스에 정의되지 않은 임의의 유형 (예 :이 인스턴스 String)을 전달하면 어떻게됩니까?
Tash Pemhiwa

6
@TashPemhiwa 그런 다음 선택 항목에 String 및 Object를 추가합니다. 창의성과 문제 해결은 프로그래머에게 최고의 자산입니다.
Kato

8
그래도 이것은 (객체 방향 / 다형성의 목적을
무력하게

3
런타임이 아닌 컴파일 타임에 발생하는 서명 선택. 따라서이 기술은 컴파일 타임에 아직 알지 못하는 것을 알려주지 않습니다. docs.oracle.com/javase/specs/jls/se7/html/…
jmh

26

a.getClass().getName()-에서 참조하는 실제 객체의 데이터 유형을 제공 a하지만 변수 a가 원래 선언되었거나 이후에 캐스팅 된 데이터 유형은 제공하지 않습니다 .

boolean b = a instanceof String-에서 참조하는 실제 객체 a가 특정 클래스의 인스턴스 인지 여부를 알려줍니다 . 다시 말하지만, 변수 a가 원래 선언되었거나 이후에 캐스팅 된 데이터 유형 은 instanceof 연산자의 결과와 관련이 없습니다.

이 정보는 다음에서 가져 왔습니다. Java에서 변수 유형을 어떻게 알 수 있습니까?

이것은 일어날 수 있습니다. 나는 Stringint로 구문 분석 Integer.parseInt(s.substring(a, b))하려고하는데 그것을 요약하기 전에 int 또는 쓰레기를 쫓아 내는지 알고 싶습니다 .

그건 그렇고, 이것은 Reflection으로 알려져 있습니다. 주제에 대한 추가 정보는 다음과 같습니다. http://docs.oracle.com/javase/tutorial/reflect/


14

int 대신 Integer, double 대신 Double 등으로 작업 할 수 있습니다 (이러한 클래스는 모든 기본 유형에 대해 존재합니다). 그런 다음 instanceof 연산자를 사용할 수 있습니다.if(var instanceof Integer){...}


2
유효한 사용 사례 만 있으면됩니다.
Marquis of Lorne

가장 효율적인 접근 방식 인 것 같습니다.
I.Tyger 2015 년

13

다음을 사용하십시오.

.getClass().getSimpleName();

예:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());

산출:

StringBuilder

1
randSBNULL을 보유 하면 작동하지 않는다는 점에 유의하십시오 .
Basil Bourque

8

글쎄, 변수의 유형을 확인하는 것은 이렇게 할 수 있다고 생각합니다.

public <T extends Object> void checkType(T object) {    
    if (object instanceof Integer)
        System.out.println("Integer ");
    else if(object instanceof Double)
        System.out.println("Double ");
    else if(object instanceof Float)
        System.out.println("Float : ");
    else if(object instanceof List)
        System.out.println("List! ");
    else if(object instanceof Set)
        System.out.println("Set! ");
}

이렇게하면 오버로드 된 메서드가 여러 개 필요하지 않습니다. 추가 된 이점으로 인해 배열보다 컬렉션을 사용하는 것이 좋습니다. 그래도 배열 유형을 확인하는 방법을 모르겠습니다. 누군가가이 솔루션을 개선 할 수 있습니다. 도움이 되었기를 바랍니다!

추신 예, 이것이 기본 요소도 확인하지 않는다는 것을 알고 있습니다.


6

질문의 첫 번째 부분은 의미가 없습니다. 컴파일 타임에 기본 변수의 유형을 모르는 상황은 없습니다.

두 번째 부분에서 변수가 배열인지 여부를 아직 알지 못하는 유일한 상황은 객체 인 경우입니다. 어떤 경우에 object.getClass().isArray()알려줄 것입니다.


5
문자열에서 객체로의 해시 맵을 갖고 그 해시 맵에 int를 넣은 다음 다시 꺼낼 수 있습니다. 내가 아는 유일한 것은 그것이 "객체"이고 그것이 어떤 유형인지 확인해야 할 수 있다는 것입니다. 좋다고 말하는 것이 아니라 가능하다고 말하는 것뿐입니다.
matty-d


2

나는이 답변들 중 어느 것도 만족스럽지 않았고, 옳은 답변은 설명과 반대표가 없기 때문에 주변을 검색하고 몇 가지를 찾아서 이해하기 쉽도록 편집했습니다. 바라는 것만 큼 솔직하지 말고 그것을 가지고 놀아 라.

//move your variable into an Object type
Object obj=whatYouAreChecking;
System.out.println(obj);

// moving the class type into a Class variable
Class cls=obj.getClass();
System.out.println(cls);

// convert that Class Variable to a neat String
String answer = cls.getSimpleName();
System.out.println(answer);

방법은 다음과 같습니다.

public static void checkClass (Object obj) {
    Class cls = obj.getClass();
    System.out.println("The type of the object is: " + cls.getSimpleName());       
}

1

변수가 초기화되지 않은 제네릭 유형이면 이러한 답변 중 어느 것도 작동하지 않습니다.

그리고 내가 찾을 수있는 것은 매우 추한 해결 방법 을 사용하거나 초기화 된 매개 변수를 함수에 전달하여 제자리에 만드는 방법으로 만 가능 합니다. 여기를 참조하세요.

<T> T MyMethod(...){ if(T.class == MyClass.class){...}}

T런타임에 지워 지므로 매개 변수 에서 유형을 직접 가져올 수 없으므로 유효하지 않습니다 .

<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}

이것은 호출자가 out호출하기 전에 변수를 인스턴스화 할 책임이 있기 때문에 작동합니다 . 호출시 out이 null 인 경우에도 예외가 발생하지만 연결된 솔루션과 비교하면 이것이 가장 쉬운 방법입니다.

나는 이것이 일종의 특정 응용 프로그램이라는 것을 알고 있지만 이것이 Java로 변수 유형을 찾는 Google의 첫 번째 결과이기 때문에 T포함되어야한다고 생각합니다.



0

기본적으로 예를 들면 다음과 같습니다.

public class Kerem
{
    public static void main(String[] args)
    {
        short x = 10;
        short y = 3;
        Object o = y;
        System.out.println(o.getClass()); // java.lang.Short
    }

}

1
작은 힌트 : 10 세이며,이 질문> 일부가 가지고있는 10 답> 100 upvotes이있는 경우, 다음은 (불가능하지만) 매우 , 매우 새로운 답변이 유용한 무언가를 추가 할 수있는 가능성 (특히, "여기,보세요, 이것은 뭔가를 인쇄합니다"라는 코드 스니
펫일 때

-4

public class Demo1 {

Object printType(Object o)
{
    return o;
}
 public static void main(String[] args) {

    Demo1 d=new Demo1();
    Object o1=d.printType('C');
    System.out.println(o1.getClass().getSimpleName());

}

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.