๊ตญ๋น์ง์ 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์ ์ํ๊ณ ์ถ๋ค.
๋๊ธ