ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ฆ ์ ๋ค๋ฆญ ๋ฉ์๋ vs ์์ผ๋์นด๋, ์ธ์ ๋ญ ์จ์ผ ํ ๊น?
vellahw 2026. 9. 20. 14:46๐ฆ
์๋ฐ๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ฌํ ์ ๋ค๋ฆญ๊ณผ ์์ผ๋์นด๋๋ฅผ ๋์ถฉ ๊ฐ์ผ๋ก๋ง ์ก๊ณ ๋์ด๊ฐ๋ ๊ฒ๋ค์ ์ด๋ฒ์ ๊ณต๋ถ๋ฉด์ ๊ฐ๋ ์ ํํํ๊ฒ ๋ค์ง ์ ์์๋ค.
๊ทธ๋ฐ๋ฐ ์ ๋ค๋ฆญ ๋ฉ์๋์ ์์ผ๋์นด๋ ๋ฉ์๋๋ฅผ ๊ฐ๊ฐ ์ธ์ ์ฐ๋ ๊ฒ ๊ฐ์ฅ ๋ฒ ์คํธ์ธ์ง์ ๋ํ ๊ถ๊ธ์ฆ์ด ์๊ฒผ๋ค.
์ด ๋ ๋ฐฉ์์ ์ฐจ์ด์ ์ ํ ๊ธฐ์ค์ ๊น๋ํ๊ฒ ์ ๋ฆฌํด ๋ณด์๋ค.
1. ์์ ์ฝ๋ ์ดํด๋ณด๊ธฐ
์์ ํด๋์ค์ธ Fruit์ ์ด๋ฅผ ์์๋ฐ๋ Apple, Banana๊ฐ ์๊ณ , ๊ณผ์ผ์ ๋ด๋ FruitBox ํด๋์ค๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์์์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํด ์ฃผ๋ FruitPrinter ํด๋์ค๋ฅผ ์์ฑํ๋ค.
public class FruitPrinter {
// V1: ์ ๋ค๋ฆญ ๋ฉ์๋ ๋ฐฉ์
public static <T extends Fruit> void printV1(FruitBox<T> box) {
box.showInfo();
}
// V2: ์์ผ๋์นด๋ ๋ฐฉ์
public static void printV2(FruitBox<? extends Fruit> box) {
box.showInfo();
}
}
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์คํํ๋ ํ ์คํธ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
public class FruitPrinterTest {
public static void main(String[] args) {
FruitBox<Apple> appleBox = new FruitBox<>();
appleBox.in(new Apple("์ฌ๊ณผ", 1000));
FruitBox<Banana> bananaBox = new FruitBox<>();
bananaBox.in(new Banana("๋ฐ๋๋", 2000));
FruitPrinter.printV1(appleBox); // ์ ๋ค๋ฆญ ๋ฐฉ์
FruitPrinter.printV2(appleBox); // ์์ผ๋์นด๋ ๋ฐฉ์
}
}
printV1๊ณผ printV2 ๋ชจ๋ ๋ฌธ์ ์์ด ์ ์คํ๋๋ค.
๊ทธ๋ฐ๋ฐ ์๋ฐ์์๋ ์ด์ฒ๋ผ ๋จ์ํ ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด๋ฅผ ์กฐํ/์ถ๋ ฅํ๋ ์ํฉ์์๋
์์ผ๋์นด๋ ๋ฐฉ์์ธ printV2๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊ถ์ฅ๋๊ณ ํจ์จ์ ์ด๋ค. ์ ๊ทธ๋ด๊น?
2. ์ ์์ผ๋์นด๋๊ฐ ๋ ์ ํธ๋ ๊น?
๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด “์ฝ๋์ ๊ฐ๊ฒฐํจ๊ณผ ์ง๊ด์ฑ” ๋๋ฌธ์ด๋ค.
1) ์ ๋ค๋ฆญ ๋ฉ์๋ (printV1)
public static <T extends Fruit> void printV1(FruitBox<T> box)
์ ๋ค๋ฆญ ๋ฉ์๋๋ ๋ฉ์๋ ๋ฆฌํด ํ์ ์๋ถ๋ถ์ ์ด๋ผ๋ ํ์ ๋งค๊ฐ๋ณ์ ์ ์ธ๋ถ๋ฅผ ํ์๋ก ์ ์ด์ค์ผ ํ๋ค.
ํ์ง๋ง ์ด ๋ฉ์๋๋ ์ ๋ฌ๋ฐ์ box ๋ด๋ถ์ showInfo()๋ง ํธ์ถํ๊ณ ๋๋๋ค.
์ฆ, ํ์ T๋ฅผ ๋ฉ์๋ ๋ด๋ถ์์ ๋ฐ๋ก ๋ณ์๋ก ์ ์ธํ๊ฑฐ๋ ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฌ์ฉํ ์ผ์ด ์ ํ ์๋ค.
๊ฒฐ๊ตญ ๋ฑ ํ ๋ฒ ์ฐ๊ธฐ ์ํด ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๋ ๋ถํ์ํ ๋ฒ๊ฑฐ๋ก์(Boilerplate)์ด ์๊ธฐ๋ ์ ์ด๋ค.
2) ์์ผ๋์นด๋ ๋ฉ์๋ (printV2)
public static void printV2(FruitBox<? extends Fruit> box)
๋ฐ๋ฉด ์์ผ๋์นด๋๋ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฉ์๋ ์ ์ธ๋ถ์ ๋ฐ๋ก ์ ์ํ ํ์๊ฐ ์๋ค.
๋งค๊ฐ๋ณ์ ์์น์ ๊ณง๋ฐ๋ก ? ๋ฅผ ๋ฃ์ด ์์ฑํ๋ค.
์ด ์ฝ๋๊ฐ ์๋ฏธํ๋ ๋ฐ๋ ์์ฃผ ์ง๊ด์ ์ด๋ค.
“์ด ๋ฉ์๋๋ ํน์ ํ์ T๊ฐ ๋ฌด์์ธ์ง ๊ธฐ์ตํ ํ์ ์์ด Fruit๋ฅผ ์์๋ฐ์ ๊ณผ์ผ์ ๋ด์ FruitBox์ด๊ธฐ๋ง ํ๋ฉด ๋ค ๋ฐ์์ค๊ฒ!”
๊ฐ๋ ์ฑ๋ ์ข์์ง๊ณ ๋ฌธ๋ฒ๋ ํจ์ฌ ๋จ์ํด์ง๋ค.
3. ํต์ฌ ์ ๋ฆฌ: ์ธ์ ๋ฌด์์ ์จ์ผ ํ ๊น?
๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๋๋ง์ ๊ธฐ์ค์ ์๋์ ๊ฐ๋ค.
๐ ์์ผ๋์นด๋๋ฅผ ์จ์ผ ํ๋ ์ํฉ
- ๋จ์ํ ์ธ์๋ก ๋์ด์จ ๊ฐ์ฒด๋ฅผ ์กฐํํ๊ฑฐ๋ ์ฌ์ฉ(์ฝ๊ธฐ)๋ง ํ ๋
- ์: printV2์ฒ๋ผ ๋จ์ํ box.showInfo()๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ
- ํ์ ๋งค๊ฐ๋ณ์ T๊ฐ ๋ฉ์๋ ๋ด๋ถ๋ ๋ฆฌํด ํ์ ์์ ์ฌ์ฌ์ฉ๋ ํ์๊ฐ ์์ ๋
- ์ฝ๋๋ฅผ ์งง๊ณ ์ง๊ด์ ์ผ๋ก ์ ์งํ๊ณ ์ถ์ ๋
๐ ์ ๋ค๋ฆญ ๋ฉ์๋๋ฅผ ์จ์ผ ํ๋ ์ํฉ
- ์ฌ๋ฌ ๋งค๊ฐ๋ณ์ ๊ฐ์ ํ์ ์ฐ๊ณ(๊ด๊ณ)๊ฐ ํ์ํ ๋
public static <T extends Fruit> void move(FruitBox<T> from, FruitBox<T> to)
์ ์ฝ๋์ฒ๋ผ from๊ณผ to๊ฐ ๋ฐ๋์ ๋์ผํ ๊ณผ์ผ ํ์ ์ด์ด์ผ ํ ๋๋ ์ ๋ค๋ฆญ ๋ฉ์๋๋ฅผ ์จ์ผ ํ๋ค.
์์ผ๋์นด๋๋ฅผ ์ฐ๋ฉด from์ ์ฌ๊ณผ ์์, to๋ ๋ฐ๋๋ ์์๊ฐ ๋ ์๋ ์์ด์ ํ์ ์์ ์ฑ์ด ๊นจ์ง๋ค.
- ๋ฉ์๋์ ๋ฐํ ํ์ ์ด ์ ๋ ฅ ๋งค๊ฐ๋ณ์์ ํ์ ๊ณผ ์ฐ๊ด๋ ๋
public static <T extends Fruit> T getFirstFruit(FruitBox<T> box)
์ ์ฝ๋์ฒ๋ผ ์์์์ ๊ณผ์ผ์ ๊บผ๋ด์ ๊ทธ ๊ณผ์ผ์ ํ์ ๊ทธ๋๋ก ๋ฐํํด์ผ ํ๋ค๋ฉด T ์ ์ธ์ด ํ์์ ์ด๋ค.
๋ง๋ฌด๋ฆฌ
์ฒ์์ ์์ผ๋์นด๋๊ฐ ๋ฌธ๋ฒ๋ง ๋ ๋์ด๋ ๋๋์ด์๋๋ฐ
ํ์ ๋งค๊ฐ๋ณ์์ ์ฌ์ฌ์ฉ์ฑ ์ฌ๋ถ์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ํ์ ์ผ์น ํ์์ฑ์ด๋ผ๋ ๊ธฐ์ค์ ์ธ์ฐ๊ณ ๋๋ ๋ช ํํด์ก๋ค!

'BE > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๐ก ์ข์ ์ฝ๋๋ ๊ฒฐ์ ์ ๋์ค์ผ๋ก ๋ฏธ๋ฃฌ๋ค (0) | 2026.10.27 |
|---|---|
| ๐งฉ String ๋ฌธ์์ด ์ฐ๊ฒฐ ์ต์ ํ ์์ (0) | 2026.09.12 |
| ๐ Java static์ด๋? ์ธ์คํด์ค ๋ฉ์๋์ ๋น๊ตํด์ ์ดํดํ๊ธฐ (0) | 2026.04.15 |
| DTO์ VO (1) | 2023.02.03 |
| MVC - ์ปค๋งจ๋ ํจํด์ ์ด์ฉํ ์์ฒญ URI๋ฅผ ๋ช ๋ น์ด๋ก ์ฌ์ฉํ๊ธฐ (1) | 2022.10.11 |