instanceof에 대하여

2025. 1. 13. 22:05·Back End/JAVA

⭐️ instancof란 ?

instanceof는 Java에서

객체가 특정 클래스의 하위 타입인지 (메모리가 있는지),

특정 인터페이스의 구현체인지

확인하기 위해 사용하는 타입 검사 연산자다.

 

⭐️ instanceof를 사용하는 가장 큰 이유는 "다운 캐스팅"을 안전하게 사용하기 위함이다‼️

 

[ 표현법 ]

object instanceof Type

 

[ 코드 ]

// 부모 클래스
class Animal {
    public void sound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

// 자식 클래스 1
class Dog extends Animal {
    public void sound() {
        System.out.println("강아지가 멍멍 소리를 냅니다.");
    }

    public void wagTail() {
        System.out.println("강아지가 꼬리를 흔듭니다.");
    }
}

// 자식 클래스 2
class Cat extends Animal {
    public void sound() {
        System.out.println("고양이가 야옹 소리를 냅니다.");
    }

    public void scratch() {
        System.out.println("고양이가 발톱을 세웁니다.");
    }
}

// 테스트 클래스
public class InstanceofExample {
    public static void main(String[] args) {
        // 부모 타입으로 자식 객체를 참조 (업캐스팅)
        Animal myAnimal1 = new Dog();
        Animal myAnimal2 = new Cat();

        // 공통 메서드 실행
        myAnimal1.sound(); // 강아지가 멍멍 소리를 냅니다.
        myAnimal2.sound(); // 고양이가 야옹 소리를 냅니다.

        // 특정 타입인지 확인 후 다운캐스팅
        if (myAnimal1 instanceof Dog) {
            Dog myDog = (Dog) myAnimal1; // 안전한 다운캐스팅
            myDog.wagTail(); // 강아지가 꼬리를 흔듭니다.
        }

        if (myAnimal2 instanceof Cat) {
            Cat myCat = (Cat) myAnimal2; // 안전한 다운캐스팅
            myCat.scratch(); // 고양이가 발톱을 세웁니다.
        }

        // 잘못된 타입 체크
        if (myAnimal1 instanceof Cat) {
            System.out.println("myAnimal1은 Cat 타입입니다."); // 출력되지 않음
        } else {
            System.out.println("myAnimal1은 Cat 타입이 아닙니다."); // 출력됨
        }
    }
}

 

InstanceofExample 출력문

 

 

우선 부모 클래스인 Animal을 상속받는 Dog , Cat 클래스를 정의하고 ,

메인클래스에서 특정 타입인지 확인 후에 다운 캐스팅을 진행한다.

다운 캐스팅을 하기 위해서 우선 업캐스팅 관계여야된다.

 

[ 업캐스팅 ]

// 부모 타입으로 자식 객체를 참조 (업캐스팅)
Animal myAnimal1 = new Dog();
Animal myAnimal2 = new Cat();

 

myAnimal1과 myAnimal2 참조변수가 new 생성자로 Dog와 Cat을 만들때 

다형적 참조를 통해 부모 타입이 자식타입을 받고 있는것이 가능한데 ,

이때 Dog과 Cat 인스턴스가 만들어 질때 부모 클래스가 먼저 생성되고,

그 후에 자식이 메모리에 생성된다(업캐스팅).

 

이렇게 단순하게 알 수 있는 경우도 있지만 나중에 단일 상속이 많아지거나 ,

구현관계가 많아지면 하나하나 따져볼 수가 없다.

 

⭐️ 그렇기때문에 instanceof를 사용하여 상속관계에 있는지 ,

구현 관계에 있는지 확인할 수 가 있다 ‼️

 

[ instanceof가 필요한 경우 ]

Animal myAnimal3 = new Animal();
((Dog)myAnimal3).sound();

 

만약 instanceof를 통해 확인하지 않으면 현재 Animal 객체를 생성할때 자식인 Dog가

메모리상에 생성된지 알수 없기때문에 다운캐스팅할 경우

 

ClassCastException에러

 

위와같이 ClassCastException이 발생하게 된다. 

ClassCastException은 실제 유형과 호환되지 않는 클래스로 객체를 

형변환하려고 하면 발생하게된다.

 

그렇기 때문에 반드시 instanceof를 통해 안전하게 다운캐스팅을 하도록 하자.

 

'Back End > JAVA' 카테고리의 다른 글

제네릭에 대하여  (0) 2025.01.17
exception에 대하여  (1) 2025.01.15
상속에 대하여  (3) 2025.01.11
접근 제한자에 대하여  (1) 2025.01.09
Java 생성자에 대하여  (0) 2025.01.08
'Back End/JAVA' 카테고리의 다른 글
  • 제네릭에 대하여
  • exception에 대하여
  • 상속에 대하여
  • 접근 제한자에 대하여
KoesJin
KoesJin
hEELo
  • KoesJin
    Seok DevLog
    KoesJin
  • 전체
    오늘
    어제
    • 분류 전체보기 (109)
      • Back End (31)
        • DataBase (15)
        • JAVA (12)
        • JDBC (4)
      • Front End (9)
        • HTML5 & CSS (3)
        • Java Script (6)
        • REACT (0)
      • Server (9)
        • JSP - TomCat - Servlet (7)
        • Spring Boot (2)
      • GitHub (1)
      • IT 지식 (기술면접 대비) (20)
      • Weekly TIL (39)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    exception
    css
    weekly til - day 43
    View
    select
    DDL
    weekly til - day 41
    GC
    commit
    dml
    MVC 패턴
    order by
    weekly til - day 38
    DAO
    weekly til - day 39
    where
    순서에 대하여
    from
    INNER JOIN
    weekly til - day 40
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
KoesJin
instanceof에 대하여
상단으로

티스토리툴바