Java ์ œ๋„ค๋ฆญ(Generic) ์™„์ „ ์ •๋ณต

2026. 2. 12. 12:38ยท๐Ÿ‘ฉ‍๐Ÿ’ปDeveloper ๐Ÿ’ก/๐Ÿ’พBack-end๐Ÿ•Š๏ธ

Java ์ œ๋„ค๋ฆญ(Generic) ์™„์ „ ์ •๋ณต (์ •์˜ ~ ์ปฌ๋ ‰์…˜๊นŒ์ง€, ์ฝ”๋“œ ํ•œ ์ค„์”ฉ ์„ค๋ช…)

1. ์ œ๋„ค๋ฆญ(Generic)์ด๋ž€?

์ž๋ฐ”์—์„œ ๋ณ€์ˆ˜/๋งค๊ฐœ๋ณ€์ˆ˜/๋ฐ˜ํ™˜๊ฐ’์€ ๋ชจ๋‘ ์ž๋ฃŒํ˜•(Type) ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ ๊ฐœ๋ฐœ์—์„œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ “๋™์ž‘์€ ๋˜‘๊ฐ™์€๋ฐ ๋‹ค๋ฃจ๋Š” ํƒ€์ž…๋งŒ ๋‹ค๋ฅธ” ์ƒํ™ฉ์ด ์ •๋ง ๋งŽ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋ฆฐํ„ฐ์— ์žฌ๋ฃŒ๋ฅผ ๋„ฃ๊ณ  ๊บผ๋‚ด๊ธฐ (Powder / Plastic)
  • ๋ฆฌ์ŠคํŠธ์— ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊บผ๋‚ด๊ธฐ (String / Integer)
  • ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ๋‹ด๋Š” ๋ฐ•์Šค(Box) ๋งŒ๋“ค๊ธฐ

์ด๋•Œ ํƒ€์ž…๋งˆ๋‹ค ํด๋ž˜์Šค๋ฅผ ๋งค๋ฒˆ ์ƒˆ๋กœ ๋งŒ๋“ค๋ฉด ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜๊ณ , Object๋กœ ํ†ตํ•ฉํ•˜๋ฉด ๊บผ๋‚ผ ๋•Œ๋งˆ๋‹ค ํ˜•๋ณ€ํ™˜(์บ์ŠคํŒ…)์ด ํ•„์š”ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ์œ„ํ—˜์ด ์ปค์ง‘๋‹ˆ๋‹ค.

โœ… ๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ์ œ๋„ค๋ฆญ(Generic) ์ž…๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ(Generic) ์ด๋ž€
“ํด๋ž˜์Šค/๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ž๋ฃŒํ˜•์„ ๋‚˜์ค‘์—(์‚ฌ์šฉ ์‹œ์ ์—) ๊ฒฐ์ •ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹”์ž…๋‹ˆ๋‹ค.
์ฆ‰, ํƒ€์ž…์„ ๋งˆ์น˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ๋ฐ›์•„์„œ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.


2. ์ œ๋„ค๋ฆญ์˜ ์žฅ์ 

(1) ์ปดํŒŒ์ผ ์‹œ ๊ฐ•ํ•œ ํƒ€์ž… ์ฒดํฌ (Type Safety)

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด “์ž˜๋ชป๋œ ํƒ€์ž…”์„ ์‹คํ–‰ ์ „์—(์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ) ์žก์•„์ค๋‹ˆ๋‹ค.

  • ์ œ๋„ค๋ฆญ ์—†์Œ → ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ClassCastException ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ์ œ๋„ค๋ฆญ ์žˆ์Œ → ์• ์ดˆ์— ์ปดํŒŒ์ผ์ด ์•ˆ ๋˜๊ฒŒ ๋ง‰์•„์คŒ

(2) ํ˜•๋ณ€ํ™˜(์บ์ŠคํŒ…) ์ œ๊ฑฐ

์ œ๋„ค๋ฆญ์ด ์—†์œผ๋ฉด Object๋กœ ๊บผ๋‚ด์˜ค๊ฒŒ ๋˜์–ด ์บ์ŠคํŒ…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด “๊บผ๋‚ผ ๋•Œ ์ด๋ฏธ ํƒ€์ž…์ด ํ™•์ •”์ด๋ฏ€๋กœ ์บ์ŠคํŒ…์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.


3. ์ œ๋„ค๋ฆญ ๋„์ž… ์ „: Raw Type(List) ์‚ฌ์šฉ ์‹œ ๋ฌธ์ œ์  (ํ˜•๋ณ€ํ™˜ + ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜)

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์ œ๋„ค๋ฆญ์„ ์“ฐ์ง€ ์•Š์€ List(= raw type) ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

 

โœ… ํ•œ ์ค„์”ฉ ์„ค๋ช…

  • List list = new ArrayList();
    • List<T>์ฒ˜๋Ÿผ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์–ด๋–ค ํƒ€์ž…์ด๋“  ์ €์žฅ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
    • ์ด๊ฑธ raw type(๋กœ ํƒ€์ž…) ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • list.add(10);
    • 10์€ int(๊ธฐ๋ณธํ˜•)์ธ๋ฐ, List๋Š” ๊ฐ์ฒด๋งŒ ์ €์žฅ ๊ฐ€๋Šฅ
    • ์ž๋ฐ”๊ฐ€ ์ž๋™์œผ๋กœ Integer(10)์œผ๋กœ ๋ฐ”๊พธ์–ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค (์˜คํ† ๋ฐ•์‹ฑ)
  • list.add("์ดˆ์ฝ”");
    • String๋„ ๋ฌธ์ œ์—†์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
    • ์ฆ‰, ์ง€๊ธˆ list์—๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์ด ์„ž์—ฌ ์žˆ๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • int num = (Integer) list.get(0);
    • raw type์˜ get()์€ ์‚ฌ์‹ค์ƒ Object๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋ž˜์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ (Integer)๋กœ ์บ์ŠคํŒ…ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • int snacks = (Integer) list.get(1);
    • list.get(1)์€ "์ดˆ์ฝ”"(String)์ธ๋ฐ Integer๋กœ ์บ์ŠคํŒ…ํ•˜๋ ค๊ณ  ํ•จ
    • ์ปดํŒŒ์ผ์€ ๋˜์ง€๋งŒ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:
    • โœ… ClassCastException

๊ฒฐ๋ก : ์ œ๋„ค๋ฆญ์ด ์—†์œผ๋ฉด “์„ž์—ฌ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ”์„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ง‰์ง€ ๋ชปํ•˜๊ณ ,
“๊บผ๋‚ผ ๋•Œ ์‹ค์ˆ˜ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์— ํญ๋ฐœ”ํ•ฉ๋‹ˆ๋‹ค.


4. ํƒ€์ž…๋ณ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด? (์ค‘๋ณต ์ฝ”๋“œ ํญ์ฆ)

3D ํ”„๋ฆฐํ„ฐ ์˜ˆ์‹œ๋กœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์žฌ๋ฃŒ ํƒ€์ž…๋งŒ ๋‹ค๋ฅผ ๋ฟ ๋กœ์ง์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

Powder ์ „์šฉ ํ”„๋ฆฐํ„ฐ

 

Plastic ์ „์šฉ ํ”„๋ฆฐํ„ฐ

 

โœ… ๋ฌธ์ œ์ 

  • ์žฌ๋ฃŒ ํƒ€์ž…๋งŒ ๋‹ค๋ฅด์ง€ ์ฝ”๋“œ๋Š” ๊ฑฐ์˜ ๋ณต๋ถ™
  • ์žฌ๋ฃŒ๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ํด๋ž˜์Šค๊ฐ€ ๊ณ„์† ์ฆ๊ฐ€

5. Object๋กœ ํ†ตํ•ฉํ•˜๋ฉด? (ํด๋ž˜์Šค๋Š” 1๊ฐœ์ง€๋งŒ ๋งค๋ฒˆ ์บ์ŠคํŒ…)

์ค‘๋ณต์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Object๋กœ ํ†ตํ•ฉํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

 

โœ… ํ•œ ์ค„์”ฉ ์„ค๋ช…

  • private Object material;
    • ์–ด๋–ค ์žฌ๋ฃŒ๋“  ์ €์žฅ ๊ฐ€๋Šฅํ•ด์ง
  • printer.setMaterial(p1);
    • Powder๋Š” Object์˜ ์ž์‹์ด๋ฏ€๋กœ ์—…์บ์ŠคํŒ…์€ ์ž๋™ (์•ˆ์ „)
  • Powder p2 = (Powder) printer.getMaterial();
    • getMaterial()์€ Object๋ฅผ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—
    • ๋‹ค์‹œ ์›๋ž˜ ํƒ€์ž…์œผ๋กœ ๋‹ค์šด์บ์ŠคํŒ…์„ ํ•ด์•ผ ํ•จ (์œ„ํ—˜)
    • ์ž˜๋ชป ์บ์ŠคํŒ…ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

โœ… ๊ฒฐ๋ก 

  • Object๋Š” “์œ ์—ฐํ•˜์ง€๋งŒ ์œ„ํ—˜ํ•˜๊ณ  ๋ถˆํŽธ”ํ•ฉ๋‹ˆ๋‹ค.

6. ์ œ๋„ค๋ฆญ์œผ๋กœ ํ•ด๊ฒฐ: GenericPrinter<T>

์ด ๋ฌธ์ œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด ์ œ๋„ค๋ฆญ์ž…๋‹ˆ๋‹ค.

 
 

โœ… ํ•œ ์ค„์”ฉ ์„ค๋ช…

  • public class GenericPrinter<T>
    • T๋Š” “๋‚˜์ค‘์— ์ •ํ•ด์งˆ ํƒ€์ž… ์ž๋ฆฌ”์ž…๋‹ˆ๋‹ค.
    • ํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ์ ์— T๊ฐ€ ์‹ค์ œ ํƒ€์ž…์œผ๋กœ ์น˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • private T material;
    • material์˜ ํƒ€์ž…์ด Powder์ผ ์ˆ˜๋„, Plastic์ผ ์ˆ˜๋„ ์žˆ์Œ (์•„์ง ๋ฏธ์ •)
  • setMaterial(T material)
    • “T ํƒ€์ž…๋งŒ” ๋ฐ›์•„์„œ ์ €์žฅ
  • T getMaterial()
    • ์ €์žฅ๋œ ๊ฐ’์„ “T ํƒ€์ž… ๊ทธ๋Œ€๋กœ” ๋ฐ˜ํ™˜
    • ์ฆ‰, Object๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์บ์ŠคํŒ…์ด ํ•„์š” ์—†์Œ
  • toString()
    • ์–ด๋–ค ๊ฐ์ฒด๋“  toString()์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ง€๋ฏ€๋กœ ์ถœ๋ ฅ ๊ฐ€๋Šฅ

7. ์ œ๋„ค๋ฆญ ํ…Œ์ŠคํŠธ: ์บ์ŠคํŒ… ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ

์žฌ๋ฃŒ ํด๋ž˜์Šค:

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ:

 

โœ… ํ•œ ์ค„์”ฉ ์„ค๋ช…

  • GenericPrinter<Powder> powderPrinter = new GenericPrinter<>();
    • ์—ฌ๊ธฐ์„œ T๋Š” Powder๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • powderPrinter.setMaterial(new Powder());
    • T=Powder์ด๋ฏ€๋กœ Powder๋งŒ ์ €์žฅ ๊ฐ€๋Šฅ
  • Powder powder = powderPrinter.getMaterial();
    • ๋ฐ˜ํ™˜ ํƒ€์ž…์ด T=Powder์ด๋ฏ€๋กœ ํ˜•๋ณ€ํ™˜์ด ํ•„์š” ์—†์Œ
  • ๋งŒ์•ฝ ์•„๋ž˜์ฒ˜๋Ÿผ ์ž˜๋ชป ๋„ฃ์œผ๋ ค ํ•˜๋ฉด?
 
powderPrinter.setMaterial(new Plastic());

โœ… ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ
→ ์‹คํ–‰ ์ „์— ์‹ค์ˆ˜๋ฅผ ๋ง‰์•„์คŒ(ํƒ€์ž… ์•ˆ์ „)


8. ์ œ๋„ค๋ฆญ๊ณผ static: ์™œ static์—๋Š” T๋ฅผ ๋ชป ์“ธ๊นŒ?

์ œ๋„ค๋ฆญ ํƒ€์ž… T๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

  • GenericPrinter<Powder> → T๊ฐ€ Powder๋กœ ์ •ํ•ด์ง
  • GenericPrinter<Plastic> → T๊ฐ€ Plastic์œผ๋กœ ์ •ํ•ด์ง

ํ•˜์ง€๋งŒ static ๋ฉค๋ฒ„๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ์ „์— ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์ ์— ๋จผ์ € ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
์ฆ‰, static์ด ๋งŒ๋“ค์–ด์งˆ ์‹œ์ ์—๋Š” T๊ฐ€ ๋ญ”์ง€ ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


9. ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ์˜ ์ œ๋„ค๋ฆญ (ArrayList<E>)

ArrayList๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(๊ฐœ๋…):

 
public class ArrayList<E> { public E get(int index) { return ...; } }
  • E๋Š” ๊ด€์šฉ์ ์œผ๋กœ Element(์š”์†Œ) ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

โœ… ํ•œ ์ค„์”ฉ ์„ค๋ช…

  • ArrayList<String> list = new ArrayList<>();
    • ์ด ๋ฆฌ์ŠคํŠธ๋Š” String๋งŒ ์ €์žฅํ•˜๋„๋ก ๊ณ ์ •
  • list.add("hello");
    • String OK
  • String s = list.get(0);
    • get()์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด E์ธ๋ฐ ์—ฌ๊ธฐ์„œ E=String
    • ๊ทธ๋ž˜์„œ ๋ฐ˜ํ™˜์ด String์œผ๋กœ ํ™•์ • → ์บ์ŠคํŒ… ๋ถˆํ•„์š”

๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

  • ์ œ๋„ค๋ฆญ์€ ํƒ€์ž…์„ ๋‚˜์ค‘์— ๊ฒฐ์ •ํ•ด์„œ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ 
  • ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ์žก์•„์ฃผ๋Š” ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ
  • Object ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ˜•๋ณ€ํ™˜ ์ง€์˜ฅ/๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ์œ„ํ—˜์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  •  

“Object๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์บ์ŠคํŒ…์ด ํ•„์š” ์—†์Œ” = ๋ฐ˜ํ™˜๊ฐ’์˜ ํƒ€์ž…์ด ์ด๋ฏธ ํ™•์ •์ด๋ผ์„œ ‘ํ™•์ธ ์ž‘์—…(์บ์ŠคํŒ…)’์„ ์•ˆ ํ•ด๋„ ๋œ๋‹ค๋Š” ๋ง์ด์•ผ.

 

1) ์บ์ŠคํŒ…(casting)์ด ๋ญ์•ผ? (ํ•œ ๋ฌธ์žฅ)

์บ์ŠคํŒ… = “์ด ๊ฐ’์€ ์ง€๊ธˆ Object๋กœ ๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค์€ โ—‹โ—‹ํƒ€์ž…์ด์•ผ”๋ผ๊ณ  ๊ฐ•์ œ๋กœ ํƒ€์ž…์„ ๋ฐ”๊ฟ”์„œ ์“ฐ๋Š” ๊ฒƒ

2) ์™œ Object๋ฉด ์บ์ŠคํŒ…์ด ํ•„์š”ํ•ด?

โœ… Object๋Š” “์ •์ฒด๊ฐ€ ์•ˆ ๋ณด์ด๋Š” ๊ฐ’”์ด์•ผ

Object ํƒ€์ž… ๋ณ€์ˆ˜์—๋Š” ์•„๋ฌด ๊ฐ์ฒด๋‚˜ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์–ด.

๊ทธ๋ž˜์„œ Object๋กœ ๋ฐ›์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ์ž…์žฅ์—์„  ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•ด:

“์ด ๊ฐ’์ด String์ธ์ง€ Integer์ธ์ง€ Powder์ธ์ง€ ๋‚œ ๋ชฐ๋ผ.
๊ทธ๋ƒฅ Object์ผ ๋ฟ์ด์•ผ.”

๊ทผ๋ฐ ๋„ˆ๋Š” “์ด๊ฑธ String์œผ๋กœ ์“ฐ๊ณ  ์‹ถ์–ด!” ๋ผ๊ณ  ํ•˜๋ฉด
์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งํ•ด:

“๋‚œ ๋ชฐ๋ผ. ๋„ค๊ฐ€ ์ง์ ‘ ์ฆ๋ช…ํ•ด(์บ์ŠคํŒ…ํ•ด).”

๊ทธ๋ž˜์„œ ์บ์ŠคํŒ…์„ ํ•ด์•ผ ํ•ด:

 

3) ๊ทธ๋Ÿผ “Object๊ฐ€ ์•„๋‹ˆ๋ฉด” ์™œ ์บ์ŠคํŒ…์ด ํ•„์š” ์—†์ง€?

โœ… ๋ฐ˜ํ™˜๊ฐ’์ด ์ด๋ฏธ “์ •์ฒด๊ฐ€ ํ™•์‹คํ•œ ํƒ€์ž…”์ด๋ฉด ์บ์ŠคํŒ…์ด ํ•„์š” ์—†์–ด

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ˜ํ™˜ ํƒ€์ž…์ด Powder๋ฉด:

์—ฌ๊ธฐ์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฏธ ์•Œ์•„:

“์•„ ๋ฐ˜ํ™˜๊ฐ’์ด Powder๊ตฌ๋‚˜. ๊ทธ๋Ÿผ Powder ๋ณ€์ˆ˜์— ๋„ฃ์–ด๋„ ์•ˆ์ „ํ•˜๋„ค.”

๊ทธ๋ž˜์„œ (Powder) ๊ฐ™์€ ์บ์ŠคํŒ…์ด ํ•„์š”๊ฐ€ ์—†์–ด.


4) ํ•ต์‹ฌ ๋น„๊ต: Object ํ”„๋ฆฐํ„ฐ vs ์ œ๋„ค๋ฆญ ํ”„๋ฆฐํ„ฐ

โŒ (A) Object๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”„๋ฆฐํ„ฐ      โœ… (B) ์ œ๋„ค๋ฆญ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”„๋ฆฐํ„ฐ (T)

 

์™œ ํ•„์š”ํ•˜๋ƒ๋ฉด getMaterial()์ด Object๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์•ผ.
์ฆ‰, “์ •์ฒด๋ฅผ ๋ชจ๋ฅด๋‹ˆ๊นŒ” ๋„ค๊ฐ€ ์ง์ ‘ Powder๋ผ๊ณ  ์ฆ๋ช…ํ•ด์•ผ ํ•จ.


 

์™œ ์บ์ŠคํŒ…์ด ์—†๋ƒ๋ฉด,
์—ฌ๊ธฐ์„œ T๋Š” ์ด๋ฏธ Powder๋กœ ์ •ํ•ด์กŒ๊ธฐ ๋•Œ๋ฌธ์ด์•ผ.

์ฆ‰ ์ปดํŒŒ์ผ๋Ÿฌ ์ž…์žฅ์—์„œ๋Š”:

  • printer๋Š” GenericPrinter<Powder>
  • ๊ทธ๋Ÿฌ๋ฉด getMaterial()์€ Powder๋ฅผ ๋ฐ˜ํ™˜
  • ๊ทธ๋ž˜์„œ Powder p = ...๊ฐ€ ์ž๋™์œผ๋กœ ์•ˆ์ „ํ•จ

5) ์‰ฌ์šด ๋น„์œ  ํ•˜๋‚˜๋กœ ๋๋‚ด๊ธฐ

  • Object ๋ฐ˜ํ™˜ = ๊ฒ€์€ ๋ด‰ํˆฌ๋กœ ๋ฐ›๊ธฐ
    • “์•ˆ์— ๋ญ ๋“ค์—ˆ๋Š”์ง€ ๋ชฐ๋ผ”
    • ๊บผ๋‚ผ ๋•Œ “์ด๊ฑฐ ์‚ฌ๊ณผ ๋งž์ง€?” ํ•˜๊ณ  ํ™•์ธ(์บ์ŠคํŒ…) ํ•ด์•ผ ํ•จ
  • Powder/T=Powder ๋ฐ˜ํ™˜ = ๋ผ๋ฒจ ๋ถ™์€ ํˆฌ๋ช… ๋ฐ•์Šค๋กœ ๋ฐ›๊ธฐ
    • “Powder ์ „์šฉ”์ด๋ผ๊ณ  ์จ์žˆ์Œ
    • ๊ทธ๋ƒฅ ๊บผ๋‚ด๋ฉด Powder์ž„ → ํ™•์ธ(์บ์ŠคํŒ…) ํ•„์š” ์—†์Œ

6) ํ•œ ์ค„๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๋‹ค์‹œ ๋งํ•˜๋ฉด

โœ… “Object๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์บ์ŠคํŒ…์ด ํ•„์š” ์—†์Œ”์ด๋ž€ ๋œป์€:

๋ฐ˜ํ™˜๊ฐ’์ด Object์ฒ˜๋Ÿผ “์ •์ฒด ๋ถˆ๋ช…”์ด ์•„๋‹ˆ๋ผ
Powder(ํ˜น์€ T=Powder)์ฒ˜๋Ÿผ ํƒ€์ž…์ด ์ด๋ฏธ ํ™•์ •๋œ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์—
๊ฐœ๋ฐœ์ž๊ฐ€ (Powder) ๊ฐ™์€ ์บ์ŠคํŒ…์„ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

 

์ œ๋„ค๋ฆญ(Generic)์„ ์“ฐ๋Š” ์ด์œ 

1) ํƒ€์ž… ์‹ค์ˆ˜๋ฅผ “์ปดํŒŒ์ผ ๋‹จ๊ณ„”์—์„œ ๋ง‰๊ธฐ ์œ„ํ•ด (Type Safety)

์ œ๋„ค๋ฆญ์ด ์—†์œผ๋ฉด(= Object/raw type) ๋‹ค๋ฅธ ํƒ€์ž…์ด ์„ž์—ฌ ๋“ค์–ด๊ฐ€๋„ ์ปดํŒŒ์ผ์€ ๋˜๊ณ , ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ํ„ฐ์งˆ ์ˆ˜ ์žˆ์–ด์š”.

  • ์ œ๋„ค๋ฆญ ์—†์Œ → ๋Ÿฐํƒ€์ž„์— ClassCastException ๊ฐ™์€ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ
  • ์ œ๋„ค๋ฆญ ์žˆ์Œ → ์• ์ดˆ์— ์ปดํŒŒ์ผ ์—๋Ÿฌ๋กœ ๋ง‰์•„์คŒ

โœ… ์ฆ‰, “์‹คํ–‰ํ•ด๋ณด๊ธฐ ์ „์—” ํƒ€์ž… ๋ฒ„๊ทธ๋ฅผ ์˜ˆ๋ฐฉํ•ฉ๋‹ˆ๋‹ค.


2) ํ˜•๋ณ€ํ™˜(์บ์ŠคํŒ…)์„ ์•ˆ ํ•˜๋ ค๊ณ  (ํŽธํ•˜๊ณ  ์•ˆ์ „)

Object๋กœ ๋ฐ›์œผ๋ฉด ๊บผ๋‚ผ ๋•Œ๋งˆ๋‹ค (Powder), (String)์ฒ˜๋Ÿผ ์บ์ŠคํŒ…์„ ํ•ด์•ผ ํ•ด์š”.
์ œ๋„ค๋ฆญ์„ ์“ฐ๋ฉด ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์ด๋ฏธ ํ™•์ •์ด๋ผ ์บ์ŠคํŒ…์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

  • ์ œ๋„ค๋ฆญ ์—†์Œ:
  •  
    Object x = list.get(0); String s = (String) x;
  • ์ œ๋„ค๋ฆญ ์žˆ์Œ:
  •  
    String s = list.get(0);

โœ… ์ฝ”๋“œ๊ฐ€ ์งง์•„์ง€๊ณ , ์บ์ŠคํŒ… ์‹ค์ˆ˜๋กœ ํ„ฐ์งˆ ์œ„ํ—˜๋„ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.


3) ๊ฐ™์€ ๋กœ์ง์„ “ํƒ€์ž…๋งŒ ๋ฐ”๊ฟ”์„œ” ์žฌ์‚ฌ์šฉํ•˜๋ ค๊ณ  (์žฌ์‚ฌ์šฉ์„ฑ/์œ ์ง€๋ณด์ˆ˜)

ํƒ€์ž…๋งŒ ๋‹ค๋ฅด๋‹ค๊ณ  ํด๋ž˜์Šค/๋ฉ”์†Œ๋“œ๋ฅผ ๊ณ„์† ๋ณต๋ถ™ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋Š˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์š”.
์ œ๋„ค๋ฆญ์€ “ํƒ€์ž… ์ž๋ฆฌ(T)”๋งŒ ๋ฐ”๊ฟ”์„œ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

์˜ˆ: ํ”„๋ฆฐํ„ฐ ๋กœ์ง์€ ๋™์ผ, ์žฌ๋ฃŒ๋งŒ ๋‹ค๋ฆ„

  • ๋ณต๋ถ™ ๋ฐฉ์‹: PowderPrinter, PlasticPrinter, … ๊ณ„์† ๋Š˜์–ด๋‚จ
  • ์ œ๋„ค๋ฆญ ๋ฐฉ์‹: GenericPrinter<T> ํ•˜๋‚˜๋กœ ๋

โœ… ์ค‘๋ณต ์ œ๊ฑฐ + ํ™•์žฅ ์‰ฌ์›€ + ์œ ์ง€๋ณด์ˆ˜ ์‰ฌ์›€.

'๐Ÿ‘ฉโ€๐Ÿ’ปDeveloper ๐Ÿ’ก > ๐Ÿ’พBack-end๐Ÿ•Š๏ธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Java Stream(์ŠคํŠธ๋ฆผ) ์™„์ „ ์ •๋ฆฌ  (0) 2026.02.12
JAVA ์Šค๋ ˆ๋“œ(Thread) ์™„์ „ ์ •๋ฆฌ  (0) 2026.02.12
JAVA ์ปฌ๋ ‰์…˜ ์ž๋ฃŒ๊ตฌ์กฐ  (0) 2026.02.11
Java ์˜ˆ์™ธ ์ฒ˜๋ฆฌ  (0) 2026.02.11
Java 8. Interface  (0) 2026.02.10
'๐Ÿ‘ฉ‍๐Ÿ’ปDeveloper ๐Ÿ’ก/๐Ÿ’พBack-end๐Ÿ•Š๏ธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Java Stream(์ŠคํŠธ๋ฆผ) ์™„์ „ ์ •๋ฆฌ
  • JAVA ์Šค๋ ˆ๋“œ(Thread) ์™„์ „ ์ •๋ฆฌ
  • JAVA ์ปฌ๋ ‰์…˜ ์ž๋ฃŒ๊ตฌ์กฐ
  • Java ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
fulfilling_enjoyable yeona๐Ÿถ๐Ÿฆซ
fulfilling_enjoyable yeona๐Ÿถ๐Ÿฆซ
Quantitative Research Engineer & Quantitative Strategist | Multimodal Alpha (Price/News/On-chain) | Regime-aware, Cost-included Backtests | Remote-first ์—ฐ๋ฆฌ์˜ ๋‚œ ๋จธ๋‹ˆ๐Ÿ’ฐ๊ฐ€ ์ข‹์•„๐Ÿ’™๐Ÿฅณ ์ถฉ๋งŒํ•˜๊ฒŒ ๊ทธ๋ฆฌ๊ณ  ์ฆ๊ฒ๊ฒŒ ๐Ÿถ ๐Ÿฆซ ๐Ÿ’›
  • fulfilling_enjoyable yeona๐Ÿถ๐Ÿฆซ
    Yeona's Diary
    Quantitative Researcher & Engineer
    AboutMe ๋ชฉํ‘œ GitHub Blog
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿค ๐Ÿ˜Ž ์•ˆ๋…•โ˜ƒ๏ธ๐Ÿ’ž (95) N
      • ๐Ÿ’™ ๐Ÿค Diary๐Ÿฐ ๐ŸŽ€ ๐Ÿงธ (39) N
        • ๐Ÿ—ฝ๋ฏธ๊ตญ DS & CS ๋ฐ•์‚ฌ ์ด๋ฏผ๐Ÿ‹ (28)
        • ๐Ÿ›ซ์—ฌํ–‰ ์ด์•ผ๊ธฐ (1)
        • ๐Ÿ“’์˜ค๋Š˜ ์ด์•ผ๊ธฐ๐Ÿ’’๐Ÿซง๐ŸŒค๏ธ (6) N
        • ๐Ÿฐโ˜˜๏ธ๐Ÿป‍โ„๏ธ๊ฐ•์•„์ง€ ์œก์•„ (0)
      • ๐ŸฌActuary๐Ÿคธ‍โ™€๏ธโœจ (1)
      • ๐Ÿ‘ฉ‍๐Ÿ’ปDeveloper ๐Ÿ’ก (35)
        • โš’๏ธ์‚ฝ์งˆ ๊ธฐ๋ก๊ธฐ๐Ÿ“[TIL] (6)
        • ๐Ÿ–ผ๏ธFront-end๐ŸŽจ (3)
        • ๐Ÿ’พBack-end๐Ÿ•Š๏ธ (15)
        • ๐Ÿคน‍โ™€๏ธAlgorithm & Coding Test๐Ÿ’ƒ (5)
        • ๐Ÿ—ปData๐Ÿ”๏ธ (1)
        • ๐Ÿ“Project๐Ÿ• (1)
      • ๐Ÿ’ฐ๊ฒฝ์ œ์  ์ž์œ  ๋‹ฌ์„ฑโœŒ๏ธ๐ŸคŸ (8)
        • ๐Ÿ“ŠQuant๐Ÿ“ˆ๐Ÿ‘ (4)
        • ๐Ÿฐ๐Ÿ›’๐Ÿฅ‡ (1)
        • ๐Ÿ’Ž ํˆฌ์ž ์‹ค์ „ ๊ฒฝํ—˜ โ˜บ๏ธ (1)
        • ๐Ÿ… Bitcoin 15๊ฐœ ๋ชจ์œผ๊ธฐ : 2040๋…„ 200์–ต+ (0)
        • ๐ŸŒŽ๋ฏธ๊ตญ ์‹œ์žฅ๐Ÿฆ (0)
      • ๐ŸŒค๏ธCloud๐ŸŒค๏ธโ˜๏ธ (2)
        • AWS (1)
        • Kubernetes (0)
        • Google Cloud Professional (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • git
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    DS
    AWS
    ๋ฏธ๊ตญ์œ ํ•™
    ์‹œ์นด๊ณ ๋Œ€
    Java
    ์‹œ์นด๊ณ ๋Œ€ํ•™๊ต
    ๊ฐ€์„ํ•™๊ธฐ
    ์‹œ์นด๊ณ 
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    CS
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
fulfilling_enjoyable yeona๐Ÿถ๐Ÿฆซ
Java ์ œ๋„ค๋ฆญ(Generic) ์™„์ „ ์ •๋ณต
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”