CodeGym /Java Blog /๋ฌด์ž‘์œ„์˜ /Java์˜ Instanceof ๋ฐ ์ƒ์†
John Squirrels
๋ ˆ๋ฒจ 41
San Francisco

Java์˜ Instanceof ๋ฐ ์ƒ์†

๋ฌด์ž‘์œ„์˜ ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•ˆ๋…•! ์ด์ „ ์ˆ˜์—…์—์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ƒ์†์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ์ด ์ฃผ์ œ๋ฅผ ๋‹ค์‹œ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๊นŠ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๊ฐ•์˜๋ฅผ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‹ค์šฉ์ ์ธ ์˜ˆ๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๊ณ  Java์˜ ํฅ๋ฏธ๋กœ์šด ์—ฐ์‚ฐ์ž๋ฅผ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณ„์Šน

๊ทธ๋ ‡๋‹ค๋ฉด ์ƒ์†์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? instanceof ๋ฐ ์ƒ์† 101 - 1 ์ƒ์†์€ ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜(Java ํฌํ•จ)์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํŒŒ์ƒ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ํ•„๋“œ ๋ฐ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์–ป์Šต๋‹ˆ๋‹ค. ์™œ ์ด๊ฒƒ์ด ํ•„์š”ํ• ๊นŒ์š”? ์ž, ํ”„๋กœ๊ทธ๋žจ์—์„œ ํŠธ๋Ÿญ, RaceCar, Sedan, Pickup ๋“ฑ ์—ฌ๋Ÿฌ ์ž๋™์ฐจ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์—๋„ ์ด ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ๊ณตํ†ต์ ์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž๋™์ฐจ์—๋Š” ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„, ์ œ์กฐ ์—ฐ๋„, ์—”์ง„ ํฌ๊ธฐ, ์ตœ๋Œ€ ์†๋„ ๋“ฑ (๋ชจ๋‘ ๋ฐ”ํ€ด์™€ ๊ธฐํƒ€ ๋ถ€ํ’ˆ์ด ๊ณตํ†ต์ ์ด๋ผ๋Š” ์‚ฌ์‹ค์€ ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค). ์ด ์ƒํ™ฉ์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ ํด๋ž˜์Šค์—์„œ ์ด๋Ÿฌํ•œ ํ•„๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค(์ƒˆ ์ž๋™์ฐจ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ฐ๊ฐ ์ถ”๊ฐ€).
  • ๋ชจ๋“  ์ž๋™์ฐจ์— ๊ณตํ†ต๋˜๋Š” ํ•„๋“œ๋ฅผ Car์ƒ์œ„ ํด๋ž˜์Šค๋กœ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค์—์„œ ํŠน์ • ์œ ํ˜•์˜ ์ž๋™์ฐจ์— ๋Œ€ํ•œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ํŒŒ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค Car.
๋‹น์—ฐํžˆ ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์ด ํ›จ์”ฌ ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
์ตœ์†Œํ•œ ์šฐ๋ฆฌ๋Š” ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ค‘๋ณต์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ํ•ญ์ƒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค). ๋˜ํ•œ ๋ชจ๋“  ์ž๋™์ฐจ์— ๊ณตํ†ต๋œ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ํ†ตํ•ฉ๋œ ๊ฐ„๋‹จํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ํด๋ž˜์Šค ๊ตฌ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋Ÿญ์— ๋‹ค๋ฅธ ์ž๋™์ฐจ์—๋Š” ์—†๋Š” ํŠน์ˆ˜ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํด๋ž˜์Šค์—์„œ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค Truck. ๋ฐฉ๋ฒ•๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž๋™์ฐจ์—๋Š” ๋ฉ”์„œ๋“œ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๊ณตํ†ต ๋™์ž‘์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ž๋™์ฐจ ์‹œ๋™, ๊ฐ€์†/์ œ๋™ ๋“ฑ). ์ด๋Ÿฌํ•œ ๊ณตํ†ต ๋ฉ”์„œ๋“œ๋Š” ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ CarํŠน์ • ์œ ํ˜•์˜ ์ž๋™์ฐจ๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ๊ณ ์œ ํ•œ ์ž‘์—…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

public class Car {

   public void gas() {
       // Accelerate
   }

   public void brake() {
       // Brake
   }
}


public class F1Car extends Car {

   public void pitStop() {
      
       // Only race cars make pit stops
   }

   public static void main(String[] args) {
      
       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
ํด๋ž˜์Šค ์— ๋ชจ๋“  ์ž๋™์ฐจ ๊ณตํ†ต ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค Car. F1Car๊ทธ๋Ÿฌ๋‚˜ "Formula 1" ๊ฒฝ์ฃผ์šฉ ์ž๋™์ฐจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค๋ฅผ ๋ณด์‹ญ์‹œ์˜ค . ํ”ผํŠธ ์Šคํƒ‘(๊ธด๊ธ‰ ์ž๋™์ฐจ ์ •๋น„๋ฅผ ์œ„ํ•œ ์ •๋ฅ˜์žฅ)์€ ๋ ˆ์ด์Šค์—์„œ๋งŒ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ๊ด€๋ จ ํŒŒ์ƒ ํด๋ž˜์Šค์— ์ด ํŠน์ • ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. instanceof ๋ฐ ์ƒ์† 101 - 2

instanceof ์—ฐ์‚ฐ์ž

Java์—๋Š” ๊ฐ์ฒด๊ฐ€ ํŠน์ • ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ํŠน์ˆ˜ ์—ฐ์‚ฐ์ž instanceof ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ true ๋˜๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค . ์ž๋™์ฐจ ์˜ˆ์ œ์˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
์ถœ๋ ฅ: true ๊ฐœ์ฒด๊ฐ€ ์žˆ๊ณ  ๋ชจ๋“  ํŠธ๋Ÿญ์ด ์ž๋™์ฐจ์ด๋ฏ€๋กœ ์—ฐ์‚ฐ์ž ๋Š” true ๋ฅผinstanceof ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค . ํด๋ž˜์Šค ๋Š” ํด๋ž˜์Šค ์—์„œ ํŒŒ์ƒ๋ฉ๋‹ˆ๋‹ค . ๋ชจ๋“  ํŠธ๋Ÿญ์€ ๊ณตํ†ต ์ƒ์œ„์ธ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค . ์—ฐ์‚ฐ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค . ๋ฉ”์„œ๋“œ("ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด ์ธ์Šคํ„ด์Šค")๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฐ์‚ฐ์ž์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์นจํ‘œ ์—†์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. TruckTruckCarCarinstanceof

public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
์ถœ๋ ฅ: false ํด๋ž˜์Šค Car(๋ฐ car ๊ฐœ์ฒด)๊ฐ€ ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค Truck. ๋ชจ๋“  ํŠธ๋Ÿญ์€ ์ž๋™์ฐจ์ด์ง€๋งŒ ๋ชจ๋“  ์ž๋™์ฐจ๊ฐ€ ํŠธ๋Ÿญ์€ ์•„๋‹™๋‹ˆ๋‹ค. Car๊ฐœ์ฒด๋Š” ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค Truck. ๋˜ ๋‹ค๋ฅธ ์˜ˆ:

public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
์ถœ๋ ฅ: True ์—ฌ๊ธฐ์„œ ๋…ผ๋ฆฌ๋„ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑํ•œ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜์—ฌ Java์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ๋ฉ๋‹ˆ๋‹ค Object("extends Object"๋ผ๊ณ  ์ž‘์„ฑํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ด๋ฏธ ์•”์‹œ๋˜์–ด ์žˆ์Œ). ์ด๊ฒƒ์ด ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์œ ์šฉํ• ๊นŒ์š”? ์—ฐ์‚ฐ์ž ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ instanceof์žฌ์ •์˜ํ•  ๋•Œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค equals(). equals์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ž˜์Šค ์—์„œ ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค String.

public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
a String๋ฅผ ์ „๋‹ฌ๋œ ๊ฐœ์ฒด์™€ ๋น„๊ตํ•˜๊ธฐ ์ „์— ๋ฉ”์„œ๋“œ๋Š” ๊ฐœ์ฒด๊ฐ€ ๋ฌธ์ž์—ด์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ์—์•ผ ๋‘ ๊ฐœ์ฒด์˜ ์†์„ฑ์„ ๋น„๊ตํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ…Œ์ŠคํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ฐ’ ๋ฐ ๊ธธ์ด ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ฐœ์ฒด๋ฅผ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•˜๊ณ  ๋ฌธ์ž์—ด๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋Š” ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION