1. ์ธํ„ฐํŽ˜์ด์Šค ์†Œ๊ฐœ

์˜ค๋Š˜์€ ์ง€์‹์˜ ๋‚ ์ž…๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์ƒˆ๋กญ๊ณ  ํฅ๋ฏธ๋กœ์šด ์ฃผ์ œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ์˜ ๊ฐœ๋…์€ ์ถ”์ƒํ™” ๋ฐ ๋‹คํ˜•์„ฑ ์›์น™์˜ ์ž์‹์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”์ƒ์ธ ์ถ”์ƒ ํด๋ž˜์Šค์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธ๋˜์ง€๋งŒ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค interface.

interface Feline
{
   void purr();
   void meow();
   void growl();
}

๋‹ค์Œ์€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

1. ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ

interface Drawable
{
   void draw();
}

interface HasValue
{
   int getValue();
}
  1. classํ‚ค์›Œ๋“œ ๋Œ€์‹  interface.
  2. ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(ํ‚ค์›Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค abstract).
  3. ์‹ค์ œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋ชจ๋“ public ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
2. ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ƒ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋งŽ์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋งํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ Java๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ:

interface Piece extends Drawable, HasValue
{
   int getX();
   int getY();
}

3. ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํด๋ž˜์Šค ์ƒ์†

ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ๋งŒ). ์ด๊ฒƒ์€ implementsํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜ˆ:

abstract class ChessItem implements Drawable, HasValue
{
   private int x, y, value;
   public int getValue()
   {
      return value;
   }

   public int getX()
   {
      return x;
   }

   public  int getY()
   {
      return y;
   }
}

ChessItem ํด๋ž˜์Šค๋Š” ์ถ”์ƒ์œผ๋กœ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค. ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์ƒ์†๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค draw. ์ฆ‰, ChessItemํด๋ž˜์Šค์—๋Š” ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ์ธ draw().

extends๋ฐ ํ‚ค์›Œ๋“œ ์˜ ๊ธฐ์ˆ ์  ์˜๋ฏธ๋Š” implements๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ƒ์†์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ตฌ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. extends์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ํด๋ž˜์Šค๊ฐ€ ์ƒ์†๋˜๊ณ ( ํ†ตํ•ด ) ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ตฌํ˜„๋œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค ( ํ†ตํ•ด implements).

4. ๋ณ€์ˆ˜

์—ฌ๊ธฐ์— ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๋ณ€์ˆ˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (์ •์  ๋ณ€์ˆ˜๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ).

ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ์–ธ์ œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๊นŒ? ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค์— ๋น„ํ•ด ๋‘ ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.



2. ๊ตฌํ˜„์—์„œ "๋ฉ”์„œ๋“œ ์„ค๋ช…"์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด์ „์— ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ํ˜ธ์ถœ๋˜๋„๋ก ํ—ˆ์šฉํ•˜๋ ค๋ฉด ๋ฉ”์„œ๋“œ์— ํ‚ค์›Œ๋“œ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๊ณ public ๋งํ–ˆ์Šต๋‹ˆ๋‹ค . ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ ์ค‘ ์ผ๋ถ€๋ฅผ ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ํ‚ค์›Œ๋“œ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค private. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ "๋ˆ„๊ตฌ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”"๊ณผ "์šฐ๋ฆฌ ์ž์‹ ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”" ๋‘ ๊ฐ€์ง€ ๋ฒ”์ฃผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

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

์ „์— ํ›„์—
class Student
{
   private String name;
   public Student(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return this.name;
   }

   private void setName(String name)
   {
      this.name = name;
   }
interface Student
{
   public String getName();
}

class StudentImpl implements Student
{
   private String name;
   public StudentImpl(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return this.name;
   }

   private void setName(String name)
   {
      this.name = name;
   }
}
public static void main(String[] args)
{
   Student student = new Student("Alibaba");
   System.out.println(student.getName());
}
public static void main(String[] args)
{
   Student student = new StudentImpl("Ali")
   System.out.println(student.getName());
}

ํด๋ž˜์Šค๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค ์˜ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค . ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์žฅ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋งŽ์€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„(์ƒ์†)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์€ ๊ณ ์œ ํ•œ ๋™์ž‘์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ธํ„ฐํŽ˜์ด์Šค ArrayList LinkedList์˜ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค List.

๋”ฐ๋ผ์„œ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„ ํด๋ž˜์Šค ์ž์ฒด๋„ ์ˆจ๊น๋‹ˆ๋‹ค(์ฝ”๋“œ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ). ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ์œ ์—ฐํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์ฆ‰์‹œ ํ•œ ๊ฐœ์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ฐœ์ฒด๋กœ ๊ต์ฒดํ•˜์—ฌ ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๊ฐœ์ฒด์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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


3. ๋‹ค์ค‘ ์ƒ์†

Java์—์„œ ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ƒ์œ„ ํด๋ž˜์Šค๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ํด๋ž˜์Šค๋Š” ์ข…์ข… ์—ฌ๋Ÿฌ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Java ์ œ์ž‘์ž๋Š” ํƒ€ํ˜‘์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์€ ๊ธˆ์ง€ํ–ˆ์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์€ ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์—ฌ๋Ÿฌ ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ๋ถ€๋ชจ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ€๋ชจ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์„ ๊ธˆ์ง€ํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์„ ํ—ˆ์šฉํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์†Œ์œ„ ๋‹ค์ด์•„๋ชฌ๋“œ ์ƒ์† ๋ฌธ์ œ๋กœ ์ธํ•ด:

๋‹ค์ค‘ ์ƒ์†

B ํด๋ž˜์Šค๊ฐ€ A ํด๋ž˜์Šค๋ฅผ ๋ฌผ๋ ค๋ฐ›์„ ๋•Œ C ํด๋ž˜์Šค์™€ D ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” A ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. C ํด๋ž˜์Šค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. A ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฐฉ์‹์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  ๊ฒƒ์ด D๊ณ„๊ธ‰์—์„œ ๊ฐˆ๋“ฑ์„ ๋‚ณ๋Š”๋‹ค.

๋‹ค์Œ์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 3๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

class Data
{
   protected int value;
}
class XCoordinate extends Data
{
   public void setX (int x) { value = x;}
   public int getX () { return value;}
}
class YCoordinate extends Data
{
   public void setY (int y) { value = y;}
   public int getY () { return value; }
}

๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋Š” value๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. XCoordinate ์ž์† ํด๋ž˜์Šค๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ €์žฅ xํ•˜๊ณ  YCoordinate์ž์† ํด๋ž˜์Šค๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ y๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐˆ๋ผ์ ธ. ๊ทธ๋Ÿฌ๋‚˜ XYCoordinates ํด๋ž˜์Šค๊ฐ€ XCoordinate๋ฐ YCoordinateํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ์ƒ์†ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€์ง€๋งŒ ๋™์ผํ•œ value variable.

๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ถฉ๋Œ์ด ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.