๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์‹œ๋„/๊ตญ๋น„์ง€์›

[D+63] ์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋ฐ7 (์™€์ผ๋“œ ์นด๋“œ)

by ๐Ÿ‡๋ฐ•๋ด‰๋ด‰๐Ÿ‡ 2022. 12. 20.

 

 

๊ตญ๋น„์ง€์› D+63

-  ์ž๋ฐ”ํ”„๋กœ๊ทธ๋ž˜๋ฐ7 -

 


 

์™€์ผ๋“œ์นด๋“œ

๊ฐœ๋…

- ์™€์ผ๋“œ ์นด๋“œ๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์˜ ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•œ type argument์ด๋‹ค.

- ์™€์ผ๋“œ์นด๋“œ๋Š” ์ œ๋„ค๋ฆญ๊ณผ ์™„์ „ํžˆ ๊ฐ™์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ€์ง„๋‹ค.

- ์™€์ผ๋“œ์นด๋“œ๋ฅผ ํ†ตํ•ด ์ œ๋„ค๋ฆญ์˜ ์‚ฌ์šฉ์„ ์ œํ•œํ•จ์œผ๋กœ ์•ˆ์ „ํ•œ ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

- ์™€์ผ๋“œ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด์˜ ์ƒํ•œ๊ณผ ํ•˜ํ•œ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์€ ๊ฒฌ๊ณ ์„ฑ๊ณผ ๊ฐ„๊ฑด์„ฑ์ด๋‹ค.

T(์ œ๋„ค๋ฆญ) → ์–ด๋–ค ๋ฐ์ดํ„ฐํƒ€์ž…๋„ ๋‹ค ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
?(์™€์ผ๋“œ์นด๋“œ) → ๋ฌด์Šจ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์˜ฌ ์ง€ ๋ชจ๋ฅธ๋‹ค + ์ œ์•ฝ์กฐ๊ฑด 

 

• ์™€์ผ๋“œ์นด๋“œ์˜ ์ƒํ•œ ์ œํ•œ (Upper-Bounded Wildcard)

- Box<? extends Number> box : ?๋Š” Number ๋˜๋Š” Number๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

- ์ƒํ•œ์ œํ•œ์„ ํ†ตํ•ด get()๊ณผ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋งŒํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

 

• ์™€์ผ๋“œ์นด๋“œ์˜ ํ•˜ํ•œ ์ œํ•œ (Lower-Bounded Wildcard)

- Box<? suer Integer> box : ?๋Š” Integer ๋˜๋Š” Integer๊ฐ€ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

- ํ•˜ํ•œ์ œํ•œ์„ ํ†ตํ•ด set()๊ณผ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœ ํ•˜๊ฒŒ ํ•œ๋‹ค.

 

• extends๋Š” get, super๋Š” set๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์™€ ์›๋ฆฌ

์—ฌ๊ธฐ Boxํด๋ž˜์Šค์™€ Box์•ˆ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” 3๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์œผ๋ฉฐ, ์ด๋•Œ 3๊ฐœ์˜ ๊ฐ์ฒด๋Š” ์ƒ์†๊ตฌ์กฐ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

์ด๋•Œ Boxํด๋ž˜์Šค์—๋Š” ํƒ€์ž…์— ๋Œ€ํ•œ ์ œํ•œ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— get๊ณผ set๋ฉ”์†Œ๋“œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์™€์ผ๋“œ์นด๋“œ์— ์ œํ•œ์„ ๊ฑธ์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์—๋Š” ๋‚ด๊ฐ€ ์–ด๋– ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์™€์ผ๋“œ์นด๋“œ์— ์ œํ•œ์„ ๊ฑธ์—ˆ์„ ๊ฒฝ์šฐ์— ํŠน์ •ํ•œ ๋ฉ”์†Œ๋“œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

 

extends์™€ get()์˜ ๊ด€๊ณ„

๋‚ด๊ฐ€ ๋ฉ”์ธ์— box์•ˆ์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋นผ๋‚ด๋Š” ์œ„์™€ ๊ฐ™์€ ๋ช…๋ น์„ ๋‚ด๋ ธ๋‹ค๊ณ  ํ•˜์ž.

 

๋ฐ•์Šค์•ˆ์— ๋„ฃ๊ณ ๋นผ๊ณ ์˜ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” BoxHandlerํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ์ค‘์—์„œ ๋ฉ”์ธํ•จ์ˆ˜์—์„œ ์š”๊ตฌํ•œ ๋ฐ•์Šค์•ˆ์— ๋‚ด์šฉ๋ฌผ์„ ๋นผ๋Š” outBox์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์˜ค๋Š” Box์˜ ํƒ€์ž…์„ extends๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํ•œ์ œํ•œ์„ ๊ฑธ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

(๋ฉ”์†Œ๋“œ์— ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋Š” Box<Toy>์™€ Box<RobotToy>์ด๋‹ค.)

outBox์—์„œ box.get๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ Toy๊ฐ์ฒด๊ฐ€ ์˜ค๋“  RobotToy๊ฐ์ฒด๊ฐ€ ์˜ค๋“  ๋ฆฌ์Šค์ฝ”ํ”„์น˜ํ™˜๋ฒ•์น™์— ์˜ํ•ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

// ๋ฉ”์ธ ํ•จ์ˆ˜
Box<Toy> box = new Box<>();
BoxHandler.outBox(box);

// BoxHandler.outBox ๋ฉ”์†Œ๋“œ
box.set(new Toy());

ํ•˜์ง€๋งŒ extends๋ฅผ ์‚ฌ์šฉํ•ด ์ œํ•œ์„ ๊ฑธ์–ด๋‘” ๋ฉ”์†Œ๋“œ ์•ˆ์— set๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

ํ˜„์žฌ Toy๊ฐ€ ๋‹ด๊ธด ๋ฐ•์Šค์— ์ƒˆ๋กœ์šด Toy์ธ ์ฐธ์กฐ๊ฐ’์ด ๋‹ค๋ฅด์ง€๋งŒ ํƒ€์ž…์ด ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ setํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

// ๋ฉ”์ธ ํ•จ์ˆ˜
Box<RobotToy> box = new Box<>();
BoxHandler.outBox(box);

// BoxHandler.outBox ๋ฉ”์†Œ๋“œ
box.set(new Toy());

// RobotToy๊ฐ€ ๋‹ด๊ธด ๋ฐ•์Šค์•ˆ์— ๊ทธ๊ฒƒ๋ณด๋‹ค ์ž‘์€ Toy๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ RobotToy๊ฐ€ ๋‹ด๊ธด ๋ฐ•์Šค์•ˆ์— ๊ทธ๊ฒƒ๋ณด๋‹ค ์ž‘์€ ๊ฐ์ฒด์ธ Toy๋ฅผ ์žฌ์„ค์ •ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ž๊ธฐ๋ณด๋‹ค ์ž‘์€ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋ฐœ์ƒ๋  ์šฐ๋ ค๊ฐ€ ์žˆ์–ด ์ถ”ํ›„์— ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— set์€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

 

extends์™€ get()์‚ฌ์šฉ ๋ชฉ์ 

- ํŠน์ • ๊ฐ์ฒด๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ์‹ถ๊ณ  readonly์˜ ์—ญํ• ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค.

- ๋ฌธ๋ฒ•์ ์œผ๋กœ get๋งŒ ํ•˜๋„๋ก ํ•˜๋ฉฐ, ์ปดํŒŒ์ผ์—์„œ ์• ์ดˆ์— ๋ชป๋“ค์–ด๊ฐ€๊ฒŒ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•˜๊ณ  ์‹ถ๋‹ค.

- ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด set์„ ์•ˆํ•˜๊ณ  ์‹ถ๋‹ค.

 

super์™€ set()์˜ ๊ด€๊ณ„

๋‚ด๊ฐ€ ๋ฉ”์ธ์— box์•ˆ์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋„ฃ๋Š” inBox๋ฉ”์†Œ๋“œ๋ช…๋ น์„ ๋‚ด๋ ธ๋‹ค๊ณ  ํ•˜์ž.

 

๋ฐ•์Šค์•ˆ์— ๋„ฃ๊ณ ๋นผ๊ณ ์˜ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” BoxHandlerํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ์ค‘์—์„œ ๋ฉ”์ธํ•จ์ˆ˜์—์„œ ์š”๊ตฌํ•œ ๋ฐ•์Šค์•ˆ์— ๋‚ด์šฉ๋ฌผ์„ ๋„ฃ๋Š” inBox์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์˜ค๋Š” Box์˜ ํƒ€์ž…์„ super๋ฅผ ์‚ฌ์šฉํ•ด ํ•˜ํ•œ์ œํ•œ์„ ๊ฑธ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

(๋ฉ”์†Œ๋“œ์— ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋Š” Box<Toy>์™€ Box<Plastic>์ด๋‹ค.)

inBox์—์„œ box.set๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ Toy๊ฐ์ฒด๊ฐ€ ์˜ค๋“  Plastic๊ฐ์ฒด๊ฐ€ ์˜ค๋“  ๋ฆฌ์Šค์ฝ”ํ”„์น˜ํ™˜๋ฒ•์น™์— ์˜ํ•ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

// ๋ฉ”์ธ ํ•จ์ˆ˜
Box<Toy> box = new Box<>();
BoxHandler.inBox(box, new Toy());

// BoxHandler.inBox ๋ฉ”์†Œ๋“œ
Toy t = box.get();

ํ•˜์ง€๋งŒ super๋ฅผ ์‚ฌ์šฉํ•ด ์ œํ•œ์„ ๊ฑธ์–ด๋‘” ๋ฉ”์†Œ๋“œ ์•ˆ์— get๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

Toy๊ฐ€ ๋‹ด๊ธด ๋ฐ•์Šค์— Toy๋ฅผ ๊บผ๋‚ด์„œ Toyํ˜• ๋ณ€์ˆ˜ t์— ๋‹ด๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

// ๋ฉ”์ธ ํ•จ์ˆ˜
Box<Plastic> box = new Box<>();
BoxHandler.inBox(box, new Toy());

// BoxHandler.inBox ๋ฉ”์†Œ๋“œ
Toy t = box.get();

// Toyํ˜• ๊ฐ์ฒด์— Toy๋ณด๋‹ค ์ž‘์€ ๊ฐ์ฒด์ธ Plastic ๊ฐ์ฒด๊ฐ€ ์˜ฌ ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ RobotToy๋ฐ•์Šค์— RbotToy๋ฅผ ๋นผ๋‚ด์–ด Toyํ˜• t์— ๋‹ด๋Š” ๊ฒƒ์€ ๋ฆฌ์Šค์ฝ”ํ”„์น˜ํ™˜์˜ ๋ฒ•์น™์— ์œ„๋ฐฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— super์—์„œ get์€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

 

extends์™€ get()์‚ฌ์šฉ ๋ชฉ์ 

- set์™ธ์˜ ๋‹ค๋ฅธ๊ฒƒ์€ ๋ชปํ•˜๊ฒŒ ์ œํ•œ์„ ๊ฑธ๊ณ  ์‹ถ๋‹ค.

- set์™ธ์— ๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์— ์ปดํŒŒ์ผ์‹œ์ ์— ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•˜๊ณ  ์‹ถ๋‹ค.

- ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด get์„ ์•ˆํ•˜๊ณ  ์‹ถ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€