반응형

Java에서 Object가 특정 타입인지 확인하려면 instanceof 연산자를 사용할 수 있습니다. 이 연산자는 객체가 특정 클래스나 인터페이스의 인스턴스인지 확인합니다.

방법 1: instanceof를 사용하여 타입 확인

Object obj = getObject(); // obj는 File, InputStream, byte[] 등이 될 수 있음

if (obj instanceof File) {
    System.out.println("Object is a File");
} else if (obj instanceof InputStream) {
    System.out.println("Object is an InputStream");
} else if (obj instanceof byte[]) {
    System.out.println("Object is a byte array");
} else {
    System.out.println("Unknown type: " + obj.getClass().getName());
}

방법 2: getClass()를 사용하여 정확한 타입 확인

객체의 정확한 타입을 확인하려면 getClass() 메서드를 사용할 수 있습니다.

Object obj = getObject();

System.out.println("The type of obj is: " + obj.getClass().getName());

방법 3: 스위치문 (Java 17 이상)

Java 17부터는 패턴 매칭 스위치문을 사용할 수 있습니다. 이를 통해 더 간결하게 타입을 검사하고 처리할 수 있습니다.

Object obj = getObject();

switch (obj) {
    case File file -> System.out.println("Object is a File: " + file.getName());
    case InputStream inputStream -> System.out.println("Object is an InputStream");
    case byte[] byteArray -> System.out.println("Object is a byte array of size: " + byteArray.length);
    default -> System.out.println("Unknown type: " + obj.getClass().getName());
}

예제: 객체 타입 판별 함수

유틸리티 메서드를 만들어 다양한 타입을 처리할 수도 있습니다.

public void processObject(Object obj) {
    if (obj instanceof File) {
        File file = (File) obj;
        System.out.println("Processing File: " + file.getAbsolutePath());
    } else if (obj instanceof InputStream) {
        System.out.println("Processing InputStream");
        // Handle InputStream logic here
    } else if (obj instanceof byte[]) {
        byte[] byteArray = (byte[]) obj;
        System.out.println("Processing byte array of length: " + byteArray.length);
    } else {
        System.out.println("Unknown object type: " + obj.getClass().getName());
    }
}

주의사항

  1. instanceof와 상속
    • 부모 클래스나 인터페이스를 기준으로 instanceof를 사용할 경우, 상속 계층을 따라가며 타입을 확인합니다.
    • 예: InputStreamObjectCloseable 인터페이스의 인스턴스이기도 합니다.
      InputStream inputStream = new FileInputStream("example.txt");
      System.out.println(inputStream instanceof Object); // true
      System.out.println(inputStream instanceof Closeable); // true
  2. 성능 고려
    • instanceofgetClass()는 비교적 경량 연산이지만, 너무 자주 호출하면 성능에 영향을 줄 수 있습니다. 가능한 경우 다형성을 활용해 타입에 따른 로직을 분리하세요.

이 방법들을 활용하면 Object의 정확한 타입을 확인하고 필요한 작업을 수행할 수 있습니다.

반응형

+ Recent posts