CodeGym /Java Blog /๋ฌด์ž‘์œ„์˜ /์ œ๋„ค๋ฆญ์˜ ์™€์ผ๋“œ์นด๋“œ
John Squirrels
๋ ˆ๋ฒจ 41
San Francisco

์ œ๋„ค๋ฆญ์˜ ์™€์ผ๋“œ์นด๋“œ

๋ฌด์ž‘์œ„์˜ ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•ˆ๋…•! ์ œ๋„ค๋ฆญ ์—ฐ๊ตฌ๋ฅผ ๊ณ„์†ํ•ฉ์‹œ๋‹ค. ๋‹น์‹ ์€ ์ด๋ฏธ ์ด์ „ ์ˆ˜์—…( ์ œ๋„ค๋ฆญ์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ varargs ์‚ฌ์šฉ ๋ฐ ์œ ํ˜• ์‚ญ์ œ ์— ๋Œ€ํ•œ ์ •๋ณด)์—์„œ ์ด์— ๋Œ€ํ•œ ์ƒ๋‹นํ•œ ์ง€์‹์„ ์–ป์—ˆ ์ง€๋งŒ ์•„์ง ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์ค‘์š”ํ•œ ์ฃผ์ œ์ธ ์™€์ผ๋“œ์นด๋“œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด๊ฒƒ์€ ์ œ๋„ค๋ฆญ์˜ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ ˆ์Šจ์„ ํ• ์• ํ–ˆ์Šต๋‹ˆ๋‹ค! ์ฆ‰, ์™€์ผ๋“œ์นด๋“œ์— ๋Œ€ํ•ด ํŠน๋ณ„ํžˆ ๋ณต์žกํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :) ์ œ๋„ค๋ฆญ์˜ ์™€์ผ๋“œ์นด๋“œ - 1์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

public class Main {

   public static void main(String[] args) {
      
       String str = new String("Test!");
       // No problem
       Object obj = str;
      
       List<String> strings = new ArrayList<String>();
       // Compilation error!
       List<Object> objects = strings;
   }
}
๋ฌด์Šจ ์ผ์ด์•ผ? ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ์œ ์‚ฌํ•œ ๋‘ ๊ฐ€์ง€ ์ƒํ™ฉ์„ ๋ด…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ String๊ฐ์ฒด๋ฅผ ๊ฐ์ฒด๋กœ ์บ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค Object. ์—ฌ๊ธฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๋ฒˆ์งธ ์ƒํ™ฉ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ฐ™์€ ์ผ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ? ์ด๋ฒˆ์—๋Š” ๋‹จ์ˆœํžˆ ์—ฌ๋Ÿฌ ๊ฐœ์ฒด์˜ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์™œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ์ฐจ์ด์ ์ด ๋ญ์•ผ? Stringํ•˜๋‚˜ ์˜ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ Object๋˜๋Š” 20๊ฐœ์˜ ๊ฐ์ฒด ๋กœ ์บ์ŠคํŒ…ํ•ฉ๋‹ˆ๊นŒ ? ๊ฐœ์ฒด ์™€ ๊ฐœ์ฒด ๋ชจ์Œ ์‚ฌ์ด์—๋Š” ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค . ํด๋ž˜์Šค๊ฐ€ ํด๋ž˜์Šค์˜ ํ•˜์œ„์ธ ๊ฒฝ์šฐ ๋Š” ์˜ ํ•˜์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค . BACollection<B>Collection<A> ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์šฐ๋ฆฌ List<String>๋ฅผList<Object>. String๋Š” ์˜ ํ•˜์œ„ Object์ด์ง€๋งŒ List<String>์˜ ํ•˜์œ„๋Š” ์•„๋‹™๋‹ˆ๋‹ค List<Object>. ์ด๊ฒƒ์€ ๋งค์šฐ ์ง๊ด€์ ์ด์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ๋“ค์€ ์™œ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์—ˆ์„๊นŒ? ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์šฐ๋ฆฌ์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค:

List<String> strings = new ArrayList<String>();
List<Object> objects = strings;
์ด ๊ฒฝ์šฐ ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

objects.add(new Object());
String s = strings.get(0);
์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  List<Object>๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปฌ๋ ‰์…˜ ์— strings์ด์ „ ๊ฐœ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ! ๋”ฐ๋ผ์„œ ์ปฌ๋ ‰์…˜ ์— ์ผ๋ฐ˜ ํ˜•์‹ ํ˜ธ์ถœ์˜ ํ˜•์‹ ์ธ์ˆ˜๋กœ ์ง€์ •๋œ ๊ฐœ์ฒด ๋งŒ ํฌํ•จ๋œ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค . ์ฆ‰, ์ œ๋„ค๋ฆญ์˜ ์ฃผ์š” ์ด์ ์ธ ํ˜•์‹ ์•ˆ์ „์„ฑ์„ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ์ž‘์—…์„ ์ค‘๋‹จํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์—๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์ด๋Š” ํ•ญ์ƒ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ณด๋‹ค ํ›จ์”ฌ ๋‚˜์ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ObjectstringsString

// Compilation error
List<Object> objects = strings;
List<String>...๊ทธ๋ฆฌ๊ณ  ์˜ ํ›„์†์ด ์•„๋‹˜์„ ์ƒ๊ธฐ์‹œํ‚ต๋‹ˆ๋‹ค List<Object>. ์ด๊ฒƒ์€ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ๊ทœ์น™์ด๋ฉฐ, ์ œ๋„ค๋ฆญ์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์† ๊ฐ‘์‹œ๋‹ค. ์ž‘์€ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

public class Animal {

   public void feed() {

       System.out.println("Animal.feed()");
   }
}

public class Pet extends Animal {

   public void call() {

       System.out.println("Pet.call()");
   }
}

public class Cat extends Pet {

   public void meow() {

       System.out.println("Cat.meow()");
   }
}
๊ณ„์ธต ๊ตฌ์กฐ๋Š” Pet์— ์˜ํ•ด ์ƒ์†๋˜๋Š” ๊ฐ„๋‹จํ•œ Animal ํด๋ž˜์Šค์— ์˜ํ•ด ๋งจ ์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค. Pet์—๋Š” Dog์™€ Cat์ด๋ผ๋Š” 2๊ฐœ์˜ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ„๋‹จํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค iterateAnimals(). ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  ๋™๋ฌผ( Animal, Pet, Cat, Dog) ์ปฌ๋ ‰์…˜์„ ๊ฐ€์ ธ์™€ ๋ชจ๋“  ์š”์†Œ๋ฅผ โ€‹โ€‹๋ฐ˜๋ณตํ•˜๊ณ  ๊ฐ ๋ฐ˜๋ณต ๋™์•ˆ ์ฝ˜์†”์— ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•ด ๋ด…์‹œ๋‹ค.

public static void iterateAnimals(Collection<Animal> animals) {

   for(Animal animal: animals) {

       System.out.println("Another iteration in the loop!");
   }
}
๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ ์ตœ๊ทผ์— ์•Œ๊ฒŒ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ , List<Cat>๋ฐ List<Dog>๋Š” ! List<Pet>์˜ ํ›„์†์ด ์•„๋‹™๋‹ˆ๋‹ค . List<Animal>์ฆ‰, iterateAnimals()๊ณ ์–‘์ด ๋ชฉ๋ก์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

import java.util.*;

public class Main3 {


   public static void iterateAnimals(Collection<Animal> animals) {

       for(Animal animal: animals) {

           System.out.println("Another iteration in the loop!");
       }
   }

   public static void main(String[] args) {


       List<Cat> cats = new ArrayList<>();
       cats.add(new Cat());
       cats.add(new Cat());
       cats.add(new Cat());
       cats.add(new Cat());

       // Compilation error!
       iterateAnimals(cats);
   }
}
์ƒํ™ฉ์ด ์ข‹์ง€ ์•Š์•„ ๋ณด์ž…๋‹ˆ๋‹ค! ๊ฐ ์ข…๋ฅ˜์˜ ๋™๋ฌผ์„ ์—ด๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :) ๊ทธ๋ฆฌ๊ณ  ๊ณต๊ต๋กญ๊ฒŒ๋„ ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค! ๋‹ค์Œ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public static void iterateAnimals(Collection<? extends Animal> animals) {

   for(Animal animal: animals) {

       System.out.println("Another iteration in the loop!");
   }
}
์ด๊ฒƒ์€ ์™€์ผ๋“œ์นด๋“œ์ž…๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ์™€์ผ๋“œ์นด๋“œ ์ค‘ ์ฒซ ๋ฒˆ์งธ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ƒํ•œ ์™€์ผ๋“œ์นด๋“œ ๋กœ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ ? ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค . ์ด ๊ตฌ์กฐ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌด์—‡์„ ๋งํ•ฉ๋‹ˆ๊นŒ? ์ด๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ (? extends Animal) ์—์„œ ํŒŒ์ƒ๋œ ๋ชจ๋“  ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด ์ปฌ๋ ‰์…˜ Animal๋˜๋Š” ๊ฐœ์ฒด ์ปฌ๋ ‰์…˜์„ ํ—ˆ์šฉํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Animal์ฆ‰, ๋ฉ”์„œ๋“œ๋Š” Animal, Pet, Dog๋˜๋Š” Cat๊ฐ์ฒด์˜ ์ปฌ๋ ‰์…˜์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ์‹œ๋‹ค.

public static void main(String[] args) {

   List<Animal> animals = new ArrayList<>();
   animals.add(new Animal());
   animals.add(new Animal());

   List<Pet> pets = new ArrayList<>();
   pets.add(new Pet());
   pets.add(new Pet());

   List<Cat> cats = new ArrayList<>();
   cats.add(new Cat());
   cats.add(new Cat());

   List<Dog> dogs = new ArrayList<>();
   dogs.add(new Dog());
   dogs.add(new Dog());

   iterateAnimals(animals);
   iterateAnimals(pets);
   iterateAnimals(cats);
   iterateAnimals(dogs);
}
์ฝ˜์†” ์ถœ๋ ฅ:

Another iteration in the loop!
Another iteration in the loop!
Another iteration in the loop!
Another iteration in the loop!
Another iteration in the loop!
Another iteration in the loop!
Another iteration in the loop!
Another iteration in the loop!
์ด 4๊ฐœ์˜ ์ปฌ๋ ‰์…˜๊ณผ 8๊ฐœ์˜ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ  ์ฝ˜์†”์—๋Š” ์ •ํ™•ํžˆ 8๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! :) ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์œ ํ˜•์— ์—ฐ๊ฒฐ๋œ ํ•„์ˆ˜ ๋…ผ๋ฆฌ๋ฅผ ๋‹จ์ผ ๋ฉ”์„œ๋“œ์— ์‰ฝ๊ฒŒ ๋งž์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋™๋ฌผ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™๋ฌผ์›์ด๋‚˜ ์ˆ˜์˜์‚ฌ ์‚ฌ๋ฌด์‹ค์—์„œ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ–ˆ์„์ง€ ์ƒ์ƒํ•ด ๋ณด์„ธ์š” :) ํ•˜์ง€๋งŒ ์ด์ œ ๋‹ค๋ฅธ ์ƒํ™ฉ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒ์† ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๋Š” ์ด๊ณ  Animal๋ฐ”๋กœ Pet์•„๋ž˜์— ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ  ๋‹ค์Œ ์ˆ˜์ค€์— ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค Cat. ์ด์ œ ๊ฐœ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์œ ํ˜•์˜ ๋™๋ฌผ๊ณผ ์ž‘๋™ํ•˜๋„๋ก ๋ฉ”์„œ๋“œ๋ฅผ Dog๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . ์ฆ‰, ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•œ๋‹ค .iterateAnimals()Collection<Animal>Collection<Pet>๋˜๋Š” Collection<Car>์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค Collection<Dog>. ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์— ๋‹ค์‹œ ์ง๋ฉดํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค./์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์„ค๋ช…ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค! ์—ฌ๊ธฐ์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ์—๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, super ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„๋˜๋Š” ํ•˜ํ•œ ์™€์ผ๋“œ์นด๋“œ ์ž…๋‹ˆ๋‹ค .

public static void iterateAnimals(Collection<? super Cat> animals) {

   for(int i = 0; i < animals.size(); i++) {

       System.out.println("Another iteration in the loop!");
   }
}
์—ฌ๊ธฐ์„œ ์›๋ฆฌ๋Š” ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐœ์ฒด ์ปฌ๋ ‰์…˜ ์ด๋‚˜ ํด๋ž˜์Šค์˜ ์กฐ์ƒ์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Œ <? super Cat>์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค . ์ด ๊ฒฝ์šฐ ํด๋ž˜์Šค, ํ•ด๋‹น ๋ถ€๋ชจ ๋ฐ ํ•ด๋‹น ๋ถ€๋ชจ์˜ ๋ถ€๋ชจ ๊ฐ€ ๋ชจ๋‘ ์ด ์„ค๋ช…๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๊ฐ€ ์šฐ๋ฆฌ์˜ ์ œํ•œ ์‚ฌํ•ญ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. iterateAnimals()CatCatCatPetAnimalDogList<Dog>

public static void main(String[] args) {

   List<Animal> animals = new ArrayList<>();
   animals.add(new Animal());
   animals.add(new Animal());

   List<Pet> pets = new ArrayList<>();
   pets.add(new Pet());
   pets.add(new Pet());

   List<Cat> cats = new ArrayList<>();
   cats.add(new Cat());
   cats.add(new Cat());

   List<Dog> dogs = new ArrayList<>();
   dogs.add(new Dog());
   dogs.add(new Dog());

   iterateAnimals(animals);
   iterateAnimals(pets);
   iterateAnimals(cats);
  
   // Compilation error!
   iterateAnimals(dogs);
}
์šฐ๋ฆฌ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๊ณ  ๋‹ค์‹œ ํ•œ ๋ฒˆ ์™€์ผ๋“œ์นด๋“œ๊ฐ€ ๋งค์šฐ ์œ ์šฉํ•œ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค :) ์ด๊ฒƒ์œผ๋กœ ์ˆ˜์—…์ด ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด์ œ Java ์—ฐ๊ตฌ์—์„œ ์ œ๋„ค๋ฆญ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ 4๊ฐœ์˜ ์ „์ฒด ๊ฐ•์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ์ด์ œ ๋‹น์‹ ์€ ์ฃผ์ œ์— ์ •ํ†ตํ•˜๊ณ  ๋ฉด์ ‘์—์„œ ๋‹น์‹ ์˜ ๋Šฅ๋ ฅ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :) ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์ž‘์—…์œผ๋กœ ๋Œ์•„๊ฐˆ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค! ๊ท€ํ•˜์˜ ํ•™์—…์—์„œ ์ตœ๊ณ ์˜ ์„ฑ๊ณต์„ ๊ฑฐ๋‘์‹ญ์‹œ์˜ค! :)
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION