Skip to content

Latest commit

Β 

History

History
98 lines (67 loc) Β· 4.01 KB

File metadata and controls

98 lines (67 loc) Β· 4.01 KB

🎯 Generic

Generic을 μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ ν•œ λ²ˆμ―€μ€ 마주치게 λ˜λŠ” κ°œλ…μΈ 곡변성을 κ°„λ‹¨νžˆ μ •λ¦¬ν•œλ‹€.
Generic은 기본적으둜 무곡변이닀.

μ‚¬μš©λœ 클래슀

πŸ”— Animal 은 μƒμœ„ 클래슀,
πŸ”— Cat 은 ν•˜μœ„ ν΄λž˜μŠ€μ΄λ‹€.
πŸ”— Haru λŠ” ν•˜μœ„ ν΄λž˜μŠ€μ΄λ‹€.

class Animal {}    
class Cat extends Animal {}
class Haru extends Cat {}

μœ„μ™€ 같은 계측 ꡬ쑰λ₯Ό μ„€μ •ν•˜κ³  곡변성에 λŒ€ν•΄ μ‚΄νŽ΄λ³Έλ‹€.

무곡변 Invariance (μ œλ„€λ¦­μ˜ κΈ°λ³Έ λ™μž‘)

"μƒμœ„ - ν•˜μœ„ 관계여도 λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ κ°„μ£Όλœλ‹€."
List<Cat>은 List<Animal>의 ν•˜μœ„ νƒ€μž…μ΄ μ•„λ‹ˆλ‹€.

List<Cat> cats = new ArrayList<>();
List<Animal> animals = cats; // ❌컴파일 μ—λŸ¬ λ°œμƒ

Generic은 기본적으둜 무곡변이기 λ•Œλ¬Έμ— νƒ€μž…μ΄ μ •ν™•νžˆ μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ λŒ€μž…ν•  수 μ—†λ‹€.
μ΄μœ λŠ” Animal 의 μ—¬λŸ¬ ν•˜μœ„ νƒ€μž…μ΄ μ‘΄μž¬ν•  λ•Œ νƒ€μž… μ•ˆμ •μ„±μ΄ κΉ¨μ§€κΈ° λ•Œλ¬Έμ΄λ‹€.
List<Animal> animals = cats; κ°€ ν—ˆμš©λ˜λ©΄, class Dog extends Animal {} 도 ν•΄λ‹Ή λ³€μˆ˜μ— 좔가될 수 있음.

λ§Œμ•½ new ArrayList<>(cats); 둜 ν•˜κ²Œλ˜λ©΄, 볡사 μƒμ„±μž λ°©μ‹μœΌλ‘œ μ—…μΊμŠ€νŒ…μ„ 톡해 리슀트λ₯Ό μƒμ„±ν•˜λ―€λ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

곡변성 Covariance (? extends T)

"ν•˜μœ„ νƒ€μž…μ„ μƒμœ„ νƒ€μž…μœΌλ‘œ λ‹€λ£° 수 μžˆλ„λ‘ ν—ˆμš©"
List<Cat>은 List<? extends Animal>의 ν•˜μœ„ νƒ€μž…μœΌλ‘œ ν—ˆμš©λœλ‹€.

List<Cat> cats = new ArrayList<>();
List<? extends Animal> animals = cats; // βœ…μ»΄νŒŒμΌ μ—λŸ¬ μ—†μŒ

animals.add(new Cat()); // ❌ μ“°κΈ°λ§Œ ν—ˆμš©

ν•˜μ§€λ§Œ, μ“°κΈ°λŠ” ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€. 였직 읽기만 κ°€λŠ₯ν•˜λ‹€.
μ»΄νŒŒμΌλŸ¬λŠ” List<? extends Animal> animals κ°€ μ •ν™•νžˆ μ–΄λ–€ νƒ€μž…μΈμ§€ μ•Œ 수 μ—†λ‹€.
Animal의 ν•˜μœ„ νƒ€μž…μ€ λͺ¨λ‘ ν—ˆμš©λ˜λ―€λ‘œ 읽기만 κ°€λŠ₯ν•˜κ³  μ“°κΈ°λ₯Ό μ œν•œν•˜λŠ” 것이닀.

μ΄λ˜ν•œ νƒ€μž… μ•ˆμ •μ„±μ— λŒ€ν•œ 이유인데, μ“°κΈ°κ°€ ν—ˆμš©λœλ‹€λ©΄,
List<? extends Animal> animals = cats; ν˜„μž¬ List<Cat> 와 닀름이 μ—†λŠ”λ°
animals.add(new Dog())μ—μ„œ νƒ€μž… μ•ˆμ •μ„±μ΄ λ¬Έμ œλœλ‹€.

μ»΄νŒŒμΌλŸ¬κ°€ 컴파일 μ‹œμ μ— μ•Œ 수 μžˆλŠ” νƒ€μž…κ³Ό λŸ°νƒ€μž„ κ³Όμ •μ—μ„œ μ•Œ 수 μ—†λŠ” 것은 νƒ€μž… μ•ˆμ •μ„±μ„ κΉ° 수 μžˆμœΌλ―€λ‘œ μ• μ΄ˆμ— ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
List<? extends T> λŠ” 컴파일 μ‹œμ μ— μ •ν™•νžˆ μ–΄λ–€ νƒ€μž…μΈμ§€ μ•Œ 수 μ—†λ‹€. ν•˜μ—¬ μ“°κΈ°λ₯Ό μ œν•œν•œλ‹€. (μ½κΈ°λŠ” 무쑰건 Animal νƒ€μž….)

List<Cat> cats = new ArrayList<>();
List<? extends Animal> animals = cats;

Cat cat = cats.get(0); // κ°€λŠ₯. (ArrayIndexOutOfBoundsException λ¬΄μ‹œ)

animals.add(new Animal()); // λΆˆκ°€: Animal이 Cat의 ν•˜μœ„ νƒ€μž…μ΄ μ•„λ‹˜.
animals.add(new Cat()); // λΆˆκ°€: κ³΅λ³€μ„±μ—μ„œλŠ” μΆ”κ°€ λΆˆκ°€.

λ°˜κ³΅λ³€μ„± Contravariance (? super T)

"ν•˜μœ„ νƒ€μž…μ„ μƒμœ„ νƒ€μž…μ— μ•ˆμ „ν•˜κ²Œ μΆ”κ°€ν•  수 μžˆλ„λ‘ ν—ˆμš©"
List<Animal>은 List<? super Cat>의 μƒμœ„ νƒ€μž…μœΌλ‘œ ν—ˆμš©λœλ‹€.

Cat의 μƒμœ„ νƒ€μž…λ“€μ˜ μ§‘ν•© λ¦¬μŠ€νŠΈμ΄λ―€λ‘œ λ‹€μ–‘ν•œ νƒ€μž…λ“€μ΄ μ‘΄μž¬ν•  수 μžˆμ–΄ μ½κΈ°λŠ” μ΅œμƒμœ„ νƒ€μž…μΈ Object둜 읽고, μ“°κΈ°λŠ” κ°€λŠ₯ν•˜λ‹€.

List<? super Cat> list = List.of(new Cat(), new Haru());

Object animal1 = animals.get(0);  // λ°˜κ³΅λ³€μ„±μ€ 기본적으둜 Object 둜 리턴.
Cat animal2 = (Cat) animals.get(0);  
// Cat animal2 = (Cat) animals.get(0);  // λͺ…μ‹œμ  ν˜•λ³€ν™˜μ΄ μ—†μœΌλ©΄ μ—λŸ¬

Animal animal3 = (Animal) animals.get(0);
// Animal animal3 = animals.get(0); // λͺ…μ‹œμ  ν˜•λ³€ν™˜μ΄ μ—†μœΌλ©΄ μ—λŸ¬

참고둜 μ˜€λ²„λ‘œλ”©ν•  λ•Œ μ œλ„€λ¦­μ˜ νƒ€μž… μ†Œκ±°μ™€ 관계 μ—†λ‹€.

void something(List<Number> args){...}
void something(List<String> args){...}