Java instanceof 연산자는 객체 또는 인스턴스가 지정된 유형의 인스턴스인지 테스트하는 데 사용된다.
Student, Rockstar, Hacker 클래스가 주어졌다.
메인 메소드에서 이 클래스들의 여러 인스턴스로 ArrayList를 채웠다.
count 메소드는 ArrayList안에 각 타입별로 얼마나 많은 인스턴스가 있는지를 계산한다.
이 코드는 3가지 정수를 출력한다. (student 클래스, rockstar 클래스, hacker 클래스의 인스턴스 수)
그런데, 코드 일부 라인이 누락되어 3줄을 고쳐야 한다.
다른데는 고치지 말고 딱 세줄만 고쳐라
instanceof
: 객체 타입 확인 연산자다. 형 변환이 가능한지 여부를 true or false로 반환해 알려준다.
(수퍼 객체인지 서브 객체인지 확인하는 데 사용한다)
object instanceOf type
의 형태로 사용하며, object가 type이거나 type을 상속받는 클래스면 true를 반환한다. 아니면 false 반환.
public class ArrayList<E> implements List {
}
public List {
ArrayList list = new ArrayList();
System.out.println(list instanceof ArrayList);
System.out.println(list instanceof List);
System.out.println(list instanceof Set);
}
//결과
true
true
false
ArrayList 객체가 있을 때, instanceOf를 사용하면 이 객체가 ArrayList인지, List로부터 상속받은 클래스의 객체인지 확인할 수 있다.
Set의 클래스인지 확인할 때는 false가 리턴되는데, arraylist는 set도 아니고, set을 상속하지도 않기 때문이다.
import java.util.*;
class Student1{}
class Rockstar{ }
class Hacker{}
public class InstanceOfKeyword{
static String count(ArrayList mylist){
int a = 0,b = 0,c = 0;
for(int i = 0; i < mylist.size(); i++){
Object element=mylist.get(i);
if(element instanceof Student1)
a++; //element가 student1 클래스이거나, 그 클래스를 상속받는다면 a를 하나 증가시킨다.
if(element instanceof Rockstar)
b++;
if(element instanceof Hacker)
c++;
}
String ret = Integer.toString(a)+" "+ Integer.toString(b)+" "+ Integer.toString(c);
return ret;
}
public static void main(String []args){
ArrayList mylist = new ArrayList();
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int i=0; i<t; i++){
String s=sc.next();
if(s.equals("Student"))mylist.add(new Student1());
if(s.equals("Rockstar"))mylist.add(new Rockstar());
if(s.equals("Hacker"))mylist.add(new Hacker());
}
System.out.println(count(mylist));
}
}
// Sample Input
// 5
// Student
// Student
// Rockstar
// Student
// Hacker
//
// Sample Output
//
// 3 1 1