[Java] instanceof 키워드란? 그리고 장단점

청포도봉봉이·2024년 2월 13일
1

java

목록 보기
15/20
post-thumbnail

instanceof

instanceof는 참조변수가 참조하고 있는 실제 클래스 또는 인터페이스인지 확인하는데 사용합니다.
보통 new 연산자를 통해 직접 클래스를 참조하는데 뭐가 문제가 될 수 있을까? 라고 생각할 수도 있을거 같습니다. 다음 예시를 살펴봅시다.

ex)

public class Animals {
    public static void doSound(Animals animals) {
        if (animals instanceof Dog) {
            Dog dog = (Dog) animals;
            dog.sound();
        } else if (animals instanceof Cat) {
            Cat cat = (Cat) animals;
            cat.sound();
        }
        else {
            System.out.println("noting!");
        }
    }
}

public class Dog extends Animals{
    public void sound() {
        System.out.println("멍멍!");
    }
}

public class Cat extends Animals{
    public void sound() {
        System.out.println("야옹~");
    }
}
  1. doSound 메소드를 살펴보면 매개변수로 Animals의 참조변수를 가지고 있습니다.
  2. Animals 클래스는 Dog, Cat 클래스의 부모 클래스입니다.
  3. 따라서 doSound 메소드의 매개변수 animals가 Animals, Dog, Cat 클래스 중 어떤 것이 올지 모릅니다.
  4. 따라서 instanceof 키워드를 이용하여 어떤 클래스의 참조 변수인지 확인하고 형 변환 후 로직을 분기처리 하였습니다.

장점

이렇게 instanceof 키워드를 사용하면 좋은 점은

  • 타입 체크하기 때문에 어떤 클래스 또는 인터페이스의 인스턴스인지 확인할 수 있습니다.
  • 타입 변환 instanceof 키워드를 사용한 후 안전하게 타입 변환을 할 수 있습니다. 그로인해 ClassCastException를 예방할 수 있습니다.

단점

하지만 instanceof를 사용하면 안좋은 점은

  • OOP를 어기게 됩니다. 객체지향원칙 중 하나인 객체는 자신이 무엇인지 알아야 한다를 어기기 때문에 객체지향적인 설계를 할 수 없습니다.
  • 불필요한 타입 체크는 CPU 시간을 소요하기 때문에 성능저하를 시킬 수 있습니다. 불필요한 사용은 줄이는게 좋습니다.

이런 단점을 해결하기 위해서는 Overriding을 사용하면 됩니다. 그럼 예시 소스를 살펴보겠습니다.

오버로딩에 관한 개념이 부족하시다면 https://velog.io/@pak4184/Java-오버로딩과-오버라이딩 를 읽어보고 오시는걸 추천드립니다.

ex)

public abstract class Animals {
    public abstract void makeSound();
}

public class Dog extends Animals {
    @Override
    public void makeSound() {
        System.out.println("멍멍입니두!");
    }
}

public class Cat extends Animals {

    @Override
    public void makeSound() {
        System.out.println("야옹입니두~");
    }
}

위 코드를 살펴보면 똑같이 Animals 클래스가 부모클래스 역할을 하고 있습니다. 하지만

  • Animals 클래스는 추상클래스 그리고 추상메서드로 구성되어 있습니다.
  • 따라서 자식 클래스 Dog, Cat에서 makeSound()를 구현하였습니다.

이렇게 되면 instanceof 키워드를 사용하지 않을 수 있습니다.

참고
https://kchs94.tistory.com/225
https://mine-it-record.tistory.com/120

profile
서버 백엔드 개발자

0개의 댓글