"์•ˆ๋…•ํ•˜์„ธ์š”, ์•„๋ฏธ๊ณ ! ํฅ๋ฏธ๋กœ์šด ์ƒˆ ์ฃผ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค."

"์˜ค๋Š˜์€ ๋งคํ˜น์ ์ธ ์ฃผ์ œ์˜ ๋‚ ์ž…๋‹ˆ๋‹ค!"

"์™œ, ๊ณ ๋งˆ์›Œ!"

"์ฒœ๋งŒ์—์š”."

" ์ฒด์Šค ๋ง์— ๋Œ€ํ•œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ChessItem ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ๋„์ž…ํ–ˆ๋˜ ๋•Œ๋ฅผ ๊ธฐ์–ตํ•˜์‹ญ๋‹ˆ๊นŒ?"

"์˜ˆ."

"์ด์ œ ๊ฐ ์กฐ๊ฐ์— ์กฐ๊ฐ์„ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์กฐ๊ฐ์ด ํ˜„์žฌ ์ขŒํ‘œ์—์„œ ์ž์ฒด์ ์œผ๋กœ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋ ๊นŒ์š”?"

"์˜ˆ." ๋‹คํ˜•์„ฑ์— ๋Œ€ํ•ด ๋ฐฐ์šด ํ›„์—๋Š” ์œ ํ˜•์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ์กฐ๊ฐ์— ๋Œ€ํ•ด ๋ Œ๋”๋ง ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ™์€:"

์˜ˆ๋ฅผ ๋“ค์–ด:
class ChessBoard
{
  public void drawAllChessItems()
  {
  //draw them regardless of their type.
  ArrayList <ChessItem> items = new ArrayList<ChessItem>();
  items.add(new King());
  items.add(new Queen());
  items.add(new Bishop());

  //draw them regardless of their type.
  for (ChessItem item: items)
  {
   item.draw();
  }
 }
}

"์ž˜ ํ–ˆ์–ด. ๋งž์•„. ๊ทธ๋Ÿฌ๋ฉด ChessItem ํด๋ž˜์Šค ์ž์ฒด์˜ ๊ทธ๋ฆฌ๊ธฐ ๋ฉ”์„œ๋“œ๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?"

"๋ชจ๋ฅด๊ฒ ์–ด์š”. ์ฒด์Šค์—๋Š” ๊ทธ๋Ÿฐ ์กฐ๊ฐ์ด ์—†์–ด์š”. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์‹œ๊ฐ์  ํ‘œํ˜„์ด ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค."

"๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ChessItem ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ฒด์Šค ๋ง์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ถ”์ƒํ™”์ผ ๋ฟ์ž…๋‹ˆ๋‹ค . ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋งŒ๋“  ํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด OOP์—์„œ ์ถ”์ƒํ™”๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์กฐ๊ฐ๋ณ„๋กœ) ๋ฐ์ดํ„ฐ ๋ฐ ๋ฉ”์„œ๋“œ๋ฅผ ๊ธฐ๋ณธ ํด๋ž˜์Šค ๋กœ ํ†ตํ•ฉํ–ˆ์ง€๋งŒ ํŠน์ • ์ฒด์Šค ์กฐ๊ฐ์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค์—์„œ ์ฐจ์ด์ ์„ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค."

Java์—๋Š” ์ด๋ฅผ ์œ„ํ•œ ํŠน์ˆ˜ ํด๋ž˜์Šค ์œ ํ˜•์ธ ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ๋‹ค์Œ์€ ์ถ”์ƒ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๊ธฐ์–ตํ•ด์•ผ ํ•  ์„ธ ๊ฐ€์ง€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

1) ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:
 public abstract class ChessItem
{
 public int x, y; //coordinates
 private int value; //the piece's "value"

 public int getValue() //an ordinary method, returns value
 {
   return value;
 }

 public abstract void draw(); //abstract method. There is no implementation.

}

2) ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋Š” ํ‚ค์›Œ๋“œ abstract ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค .

ํด๋ž˜์Šค์— ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๋„ abstract ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค .

3) ์ถ”์ƒ ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋Š” ์ฝ”๋“œ๋Š” ๋‹จ์ˆœํžˆ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž๋ฐ” ์ฝ”๋“œ ์„ค๋ช…
ChessItem item = new ChessItem();
item.draw();
์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ChessItem item = new Queen();
item.draw();
๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4) ํด๋ž˜์Šค๊ฐ€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ฒฝ์šฐ ์ƒ์†๋œ ๋ชจ๋“  ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํด๋ž˜์Šค๋„ ์ถ”์ƒ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค์— ์ง์ ‘ ์„ ์–ธ๋˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋œ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

"ํ•˜์ง€๋งŒ ์ด ๋ชจ๋“  ๊ฒƒ์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ผ๋ฐ˜ ํด๋ž˜์Šค๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์ถ”์ƒ ๋ฉ”์„œ๋“œ ๋Œ€์‹  ์—ฌ๋Š” ์ค‘๊ด„ํ˜ธ์™€ ๋‹ซ๋Š” ์ค‘๊ด„ํ˜ธ๋กœ ๊ตฌ์„ฑ๋œ ๋นˆ ๊ตฌํ˜„์„ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๊นŒ?"

"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์ œํ•œ์€ ์ˆ˜์ •์ž์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค private. ์šฐ๋ฆฌ๋Š” private์ˆ˜์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜๋„์ ์œผ๋กœ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ง์ ‘ ์•ก์„ธ์Šค๋ฅผ ์ฐจ๋‹จํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ํด๋ž˜์Šค๊ฐ€ ์šฐ๋ฆฌ public๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค."

์ถ”์ƒ ํด๋ž˜์Šค์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ž‘์„ฑ์ž๋Š” ์ž์‹ ์˜ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์†๋˜๊ณ  ์žฌ์ •์˜๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

"๋‚˜๋Š” ์•„์ง๋„ ์šฐ๋ฆฌ๊ฐ€ ์™œ ์šฐ๋ฆฌ์˜ ์‚ถ์„ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์–ดํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."

"์ด ๊ธฐ๋Šฅ์˜ ์žฅ์ ์€ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์—ญํ• ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์˜ ์ด์ ์„ ๊ณง ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ์ด ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค."