*JAVA*

[java] instanceof

깐부로부터 2021. 10. 29. 13:22

참조변수 형변환 가능여부 확인에 사용. 가능하면 true 를 반환. (자기자신 이거나 조상에 대해)

  조상 ↔ 자식

1
2
3
4
5
6
7
void dowork(Car c){
    if (c instanceof (FireEngine)) {
       FireEngeine fe = (FireEngine)c;
        fe.water();
    }
}
 

Car 클래스가 조상, FireEngeine이 자식 상속받은 객체라 가정한다.

메소드 dowork의 매개변수로는 Car타입 자기자신이나, Car타입의 자손들이 들어올 수 있다.

if문에서 instanceof연산자는 'c가 가리키는 객체가 FireEngeine이냐?' 라고 묻는것이다.

참이면 (FireEngeine)으로 형변환해서 fe는 water()메소드를 사용할 수 있게 된다.

 

  1.  형변환이 가능한지 확인
  2.  형변환

Q. 참조변수의 형변환은 왜 하나요?

A. 참조변수타입을 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위해

 

Q. instanceof 연산자 언제 사용하나요?

A. 참조변수를 형변환하기 전에 형변환 가능여부를 확인할때


 

매개변수의 다형성

참조형 매개변수는 메소드 호출시, 자신과 같은 타입 또는 자손타입의 객체를 넘겨줄 수 있다.

 

장점

      1. 다형적 매개변수
      2. 하나의 배열로 여러종류 객체 다루기
1
2
3
4
5
FireEngine fe = new FireEngine();
 
System.out.println(fe instanceof Object); //true
System.out.println(fe instanceof Car); //true
System.out.println(fe instanceof FirEngine); //true
cs
 

위의 결과들이 true로 반환되는 이유는

이러한 상속 관계이기 때문이다.

Object클래스는 모든 클래스의 최상위 조상, 클래스이다. 

그래서 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.

 

따라서 FireEngine타입인 fe는 Object와 Car도 참조하게 되는것이다.


객체 배열

조상 타입의 배열에 자손들의 객체를 담을 수 있다.

1
2
3
4
5
6
7
8
9
Product[] p = new Product[3];
 
p[0= new Tv();
p[1= new computer();
p[2= new Audio(); 
cs

Product라는 조상타입 배열을 선언한다.

Product클래스를 상속받는 모든 클래스들의 참조변수는 Product[] 배열안 인덱스에 들어 갈 수 있다.

한마디로 Product[]는 객체들이 참조하는 변수들을 묶어놓은 배열이다.

'*JAVA*' 카테고리의 다른 글

[java] 인터페이스(Interface)  (0) 2021.10.29
[java] 추상클래스(abstract)  (0) 2021.10.29
[java] 다형성  (0) 2021.10.27
[java] 오버라이딩(overriding)  (0) 2021.10.27
[java] 상속(inheritance)  (0) 2021.10.27