Publish:

ํƒœ๊ทธ: , ,

์นดํ…Œ๊ณ ๋ฆฌ:

  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.
  • ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด ์ ์šฉ ์‹œ ์žฅ์ ๊ณผ ๋‹จ์  ๋ฐ ๊ฐœ์„  ๋ฐฉํ–ฅ์„ ์•Œ์•„๋ณธ๋‹ค.

์ดํ„ฐ๋ ˆ์ดํ„ฐ(Iterator)๋ž€?

์ž๋ฃŒ๊ตฌ์กฐ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค๋ณด๋‹ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ๋ฐฉ๋ฒ• ๋˜ํ•œ ๋‹ค๋ฅด๋‹ค. ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ, for ๋ฌธ์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋ฉด ๋˜์ง€๋งŒ Set์ด๋‚˜ Map ๋“ฑ์€ ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Ÿฌํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ํƒ์ƒ‰์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ์‹์— ์ผ๊ด€์„ฑ์ด ์—†๋‹ค.

์ด๋ ‡๊ฒŒ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์„ฑ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์กฐํšŒ ๋ฐฉ์‹์€ ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ด๋‹ค.

์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด์€ ์ง์ ‘ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ ‘๊ทผํ•ด ๊บผ๋‚ด๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ, ๊ฐ’์„ ๊บผ๋‚ด์ฃผ๋Š” ์ผ์„ ๋Œ€์‹ ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๊บผ๋‚ธ๋‹ค. ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌํ•˜๋‹ค.

img.png java Collection๋“ค์€ iterable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ ์žˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ์ •์˜

๊ธฐ์กด์— ๋งŒ๋“ค์—ˆ๋˜ List ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ iterator() ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ƒ๊ด€์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ• ๋• Iterator()๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

1
2
3
4
  public interface List<E> {
        ... 
    Iterator<E> iterator();
  }

์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class LinkedListIterator<E> implements Iterator<E> {

  LinkedList<E> list;
  int cursor;

  public LinkedListIterator(LinkedList<E> list) {
    this.list = list;
  }

  @Override
  public boolean hasNext() {
    return cursor >= 0 && cursor < list.size();
  }

  @Override
  public E next() {
    return list.get(cursor++);
  }
}

๊ตฌ์ฒด์ ์ธ ์กฐํšŒ ๋ฐฉ์‹์€ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ๋งž๊ฒŒ Iterator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ์—์„œ๋Š” LinkedList ์—์„œ ์‚ฌ์šฉํ•  ๋ชฉ์ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

hasNext() ๋Š” ๋ฐ˜๋ณตํ•  ํ•ญ๋ชฉ์ด ๋‚จ์•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ค์ œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์€ next() ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค. ํ˜ธ์ถœ๋ถ€์—์„œ ๋‘˜์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋œ๋‹ค.

LinkedList ์— ๋ฐ˜๋ณต์ž ๊ตฌํ˜„ํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
public class LinkedList<E> extends AbstractList<E> {
          ...
  
  @Override
  public Iterator<E> iterator() {
    return new LinkedListIterator<>(this);
  }
          ...
}

ํ˜„์žฌ LinkedList ๋Š” List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ AbstractList ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•ด์ค€๋‹ค. ๊ตฌํ˜„๋ถ€์—๋Š” ์•„๊นŒ ๋งŒ๋“ค์–ด๋†“์€ ๋ฐ˜๋ณต์ž(LinkedListIterator)๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

LinkedListIterator์—์„œ LinkedList์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„  ์ƒ์„ฑ์ž๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ฃผ์ž…ํ•ด ์ค˜์•ผ ํ•œ๋‹ค.

LinkedListํด๋ž˜์Šค๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋„ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— this๋กœ ์ฃผ์ž…ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด LinkedListIterator๋Š” ํ˜ธ์ถœ๋ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด LinkedList๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ์ฒ˜์Œ๋ถ€ํ„ฐ(cursor) ๋ฆฌ์ŠคํŠธ ์‚ฌ์ด์ฆˆ๋งŒํผ(list.size()) ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ’์„ ์ฐพ์„ ๊ฒƒ์ด๋‹ค.

์ด์ œ LinkedList๋Š” ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ฒŒ ๋˜์—ˆ๋‹ค!

LinkedList๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ณณ์—์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ˜๋ณต์ž๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

1
  new LinkedList<>().iterator();

Iterator ๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ ์กฐํšŒํ•˜๊ธฐ

As-is

1
2
3
4
5
6
7
8
9
private void printMenu() {
  System.out.printf("[%s]\n", this.getTitle());

  for (int i = 0; i < this.menus.size(); i++) {
    System.out.printf("%d. %s\n", (i + 1), menus.get(i).getTitle());
  }

  System.out.printf("0. %s\n", "์ด์ „");
}

ํ˜„์žฌ printMenu()๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด LinkedList์˜ get() ๋ฉ”์†Œ๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ณ  ์žˆ๋‹ค. ๋งŒ์•ฝ list ํƒ€์ž…์ด ์•„๋‹ˆ๋ผ hashMap๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋ฉ”๋‰ด์ถœ๋ ฅ์„ ํ•˜๋„๋ก ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ํ•ด๋‹น ์†Œ์Šค์ฝ”๋“œ๋„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

To-be

1
2
3
4
5
6
7
8
9
10
11
12
private void printMenu() {
  System.out.printf("[%s]\n", this.getTitle());

  Iterator<Menu> iterator = this.menus.iterator();
  int i = 1;
  while (iterator.hasNext()) {
    Menu menu = iterator.next();
    System.out.printf("%d. %s\n", i++, menu.getTitle());
  }

  System.out.printf("0. %s\n", "์ด์ „");
}

Iterator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„ ์ฒ˜๋Ÿผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ Iterator๋ฅผ ๊ตฌํ˜„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ๋Š” ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†Œ์Šค๋ณ€๊ฒฝ์„ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋˜ํ•œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ๋‹ค.

๊ฐœ์„ ํ•ด์•ผ ๋  ๋ถ€๋ถ„

์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด์„ ์ ์šฉํ•ด ์ž๋ฃŒ๊ตฌ์กฐ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ์€ ํ–ˆ์ง€๋งŒ LinkedListIterator์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋‚ด๋ถ€์—์„œ ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฐพ๋Š”๋‹ค. ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์€ ์ข‹์•„์กŒ์ง€๋งŒ ๊ตณ์ด ํด๋ž˜์Šค๋กœ ๋”ฐ๋กœ ๋นผ๋†“์„ ์ด์œ ๊ฐ€ ์—†๊ณ , call stack ์ธก๋ฉด์—์„œ ๋ณต์žก๋„๋งŒ ๋” ๋†’์•„์กŒ๋‹ค. ์ด ๋ถ€๋ถ„์„ ์ข€ ๋” ๊ฐœ์„ ํ•ด๋ณด์ž.

static nested class ์‚ฌ์šฉ

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

์–ด์ฐจํ”ผ ์ž๋ฃŒ๊ตฌ์กฐ๋งˆ๋‹ค Iterator๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋ผ๋ฉด ํ•ด๋‹น ์ž๋ฃŒ๊ตฌ์กฐ ์ฝ”๋“œ ๊ฐ€๊นŒ์ด ๋ฐฐ์น˜ํ•ด ์ฝ”๋“œ๊ฐ„์˜ ์‘์ง‘๋„๋ฅผ ๋†’์—ฌ ์ข€ ๋” ์ปดํŒฉํŠธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜์ž.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class LinkedList<E> extends AbstractList<E> {
        ... //์ƒ๋žต

  @Override
  public Iterator<E> iterator() {
    return new IteratorImpl<>(this);
  }

  /* static nested class */
  private static class IteratorImpl<E> implements Iterator<E> {

    LinkedList<E> list;
    int cursor;

    public IteratorImpl(LinkedList<E> list) {
      this.list = list;
    }

    @Override
    public boolean hasNext() {
      return cursor >= 0 && cursor < list.size();
    }

    @Override
    public E next() {
      return list.get(cursor++);
    }
  }
        ...
}

LinkedListํด๋ž˜์Šค ๋‚ด๋ถ€์— static nested class ๋กœ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ตฌํ˜„ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ํ˜„์žฌ ๋ฉ”์†Œ๋“œ๋Š” ์ •์ (static)ํด๋ž˜์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์„ ๊ฐ–์ถ”๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— static์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

static nested class๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด ๋ฐ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์™ธ๋ถ€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์™€ ๋…๋ฆฝ์ : ์ •์  ์ค‘์ฒฉ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๊ด€๋ จ์ด ์—†๋‹ค. ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ธ์Šคํ„ด์Šคํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์™ธ๋ถ€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ๋น„์ •์  ๋ฉค๋ฒ„์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Œ: ์ •์  ์ค‘์ฒฉ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ •์  ๋ฉค๋ฒ„๋งŒ ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค. ๋น„์ •์  ๋ฉค๋ฒ„์—๋Š” ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋‹ค.
  3. ์ •์  ๋ฉค๋ฒ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ: ์ •์  ์ค‘์ฒฉ ํด๋ž˜์Šค๋Š” ์ •์  ํ•„๋“œ ๋ฐ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  4. ๋…๋ฆฝ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™” ๊ฐ€๋Šฅ: ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ •์  ์ค‘์ฒฉ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

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

โœ๏ธ ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„์— ์—‘์„ธ์Šคํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๋ง์€ ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ๋‹จ์ˆœํžˆ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๊ฐ’์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๋ฟ์ด์ง€, ์™ธ๋ถ€ ์ธ์Šคํ„ด์Šค์˜ ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฃผ๋กœ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜(Math ํด๋ž˜์Šค ๋“ฑ)๋ฅผ static class๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์™ธ๋ถ€ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ์ธ first๋‚˜ last์—๋Š” ์ง์ ‘ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. static nested class๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์™ธ๋ถ€ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ ์—‘์„ธ์Šค๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. this๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ฃผ์†Œ๋ฅผ ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์„œ ์‚ฌ์šฉํ•  ๋ฟ์ด๋‹ค.

์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” p.146(์•„์ดํ…œ24) ์—์„œ ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์„œ์ˆ ํ•˜๊ณ  ์žˆ๋‹ค.

์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์™€ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ๊ตฌ๋ฌธ์ƒ ์ฐจ์ด๋Š” ๋‹จ์ง€ static์ด ๋ถ™์–ด์žˆ๊ณ  ์—†๊ณ  ๋ฟ์ด์ง€๋งŒ, ์˜๋ฏธ์ƒ ์ฐจ์ด๋Š” ์˜์™ธ๋กœ ๊ฝค ํฌ๋‹ค. ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ์•”๋ฌต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ ์ •๊ทœํ™”๋œ this๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ •๊ทœํ™”๋œ this๋ž€ ํด๋ž˜์Šค๋ช….this ํ˜•ํƒœ๋กœ ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜๋Š” ์šฉ๋ฒ•์„ ๋งํ•œ๋‹ค.[JLS, 15.8.4] ๋”ฐ๋ผ์„œ ๊ฐœ๋…์ƒ ์ค‘์ฒฉ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค ์—†์ด๋Š” ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ๋ฉค๋ฒ„ ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ํ™•๋ฆฝ๋˜๋ฉฐ, ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ์ด ๊ด€๊ณ„๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒŒ ๋ณดํ†ต์ด์ง€๋งŒ, ๋“œ๋ฌผ๊ฒŒ๋Š” ์ง์ ‘ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ํด๋ž˜์Šค.new MemberClass(args)๋ฅผ ํ˜ธ์ถœํ•ด ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค๊ธฐ๋„ ํ•œ๋‹ค. ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๋“ฏ, ์ด ๊ด€๊ณ„ ์ •๋ณด๋Š” ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์•ˆ์— ๋งŒ๋“ค์–ด์ ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋ฉฐ, ์ƒ์„ฑ ์‹œ๊ฐ„๋„ ๋” ๊ฑธ๋ฆฐ๋‹ค.

๋ฉค๋ฒ„ ํด๋ž˜์Šค์—์„œ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ผ์ด ์—†๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด static์„ ๋ถ™์—ฌ์„œ ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์ž. static์„ ์ƒ๋žตํ•˜๋ฉด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค๋กœ์˜ ์ˆจ์€ ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ์•ž์„œ๋„ ์–˜๊ธฐํ–ˆ๋“ฏ ์ด ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด ์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„์ด ์†Œ๋น„๋œ๋‹ค. ๋” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค(์•„์ดํ…œ 7). ์ฐธ์กฐ๊ฐ€ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์œผ๋‹ˆ ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ ๋•Œ๋•Œ๋กœ ์‹ฌ๊ฐํ•œ ์ƒํ™ฉ์„ ์ดˆ๋ž˜ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

๋งŒ์•ฝ ์œ„ ํด๋ž˜์Šค์— static ์„ ๋–ผ๊ณ  ์ƒ์„ฑ์ž๋ฅผ ์—†์• ๊ฒŒ ๋˜๋ฉด ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
  private class IteratorImpl<E> implements Iterator<E> {
  
    // ๋ฐ”๊นฅ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ๋นŒํŠธ์ธ ํ•„๋“œ
    final LinkedList this;

    // inner ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ”๊นฅ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ›๋Š” ์ƒ์„ฑ์ž
    public IteratorImpl<E>(LinkedList p) {
      this.this = p;
    }
        ...
  }

non-static class๋Š” ์™ธ๋ถ€ ์ธ์Šคํ„ด์Šค ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•”๋ฌต์ ์œผ๋กœ this๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ธ์Šคํ„ด์Šค ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„๊ณผ ์‹œ๊ฐ„์ด ์†Œ๋น„๋œ๋‹ค.

img.png non-static class๋กœ ๋งŒ๋“ค๋ฉด ์ˆจ์€ ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ฒŒ๋œ๋‹ค. img.png ๋ฐ”๊นฅ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—” static ์„ ๋ถ™์—ฌ๋ผ!

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ๊ฐœ์„ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉ์ ์€ ์™ธ๋ถ€์˜ ์ฐธ์กฐ๋ฅผ ๋Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ Iterator์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด ์‘์ง‘๋„๋ฅผ ๋†’ํžˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ ์ฒ˜์Œ์— LinkedListIteratorํด๋ž˜์Šค๋กœ ๋”ฐ๋กœ ๋ถ„๋ฆฌ์‹œ์ผฐ๋˜ ์ฝ”๋“œ๋ฅผ LinkedList์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ†ตํ•œ ์ด์ ๋„ ์ฑ™๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” GRASP pattern์˜ Information Expert์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค.

โœ๏ธ Information Expert: ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์— ์—ญํ• ์„ ๋ถ€์—ฌํ•˜์ž. ๋‹จ์ˆœํ•ด ๋ณด์ด๋Š” ์ด ์›์น™์€ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ ์ค‘์— ํ•˜๋‚˜์ด๋‹ค. ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ์™€ ์ฒ˜๋ฆฌ๋กœ์ง์ด ํ•จ๊ป˜ ๋ฌถ์—ฌ ์žˆ๋Š” ๊ฒƒ์ด๊ณ , ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ถ”๊ณ ์ž ํ•˜๋ฉด ์˜ค์ง ์ž๊ธฐ ์ž์‹ ์˜ ์ฒ˜๋ฆฌ ๋กœ์ง์—์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์™ธ๋ถ€์—๋Š” ๊ทธ ๊ธฐ๋Šฅ(์—ญํ• )๋งŒ์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


non-static class(inner class) ์‚ฌ์šฉ

static nested class ์™€์˜ ์ฐจ์ด์ ์€ ์ƒ์„ฑ์ž์— ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋‹ค. ์ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๊ฐ€๊ณต์ฒ˜๋ฆฌ ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ, inner class ๋‚ด๋ถ€์— ์•”๋ฌต์ ์œผ๋กœ ์ƒ์„ฑ๋œ this๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ํด๋ž˜์Šค์— ์ ‘๊ทผํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

inner class๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class LinkedList<E> extends AbstractList<E> {
      ... //์ƒ๋žต
  
  @Override
  public Iterator<E> iterator() {
    return new IteratorImpl<>();
  }
  
  /* non-static class */
  private class IteratorImpl<E> implements Iterator<E> {

    Node<E> cursor;
    
    // ์ƒ์„ฑ์ž ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
    public IteratorImpl() {
      this.cursor = (Node<E>) LinkedList.this.first;  
    }

    @Override
    public boolean hasNext() {
      return cursor != null;
    }

    @Override
    public E next() {
      E value = cursor.value;
      cursor = cursor.next;
      return value;
    }
  }
      ...
}

์‹ค์ œ๋กœ java.util.LinkedList์—์„œ ๋‚ด๋ถ€ํด๋ž˜์Šค๋กœ Iterator๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค. img.png java.util.LinkedList์˜ Iterator


์ต๋ช… ํด๋ž˜์Šค(anonymous class) ์‚ฌ์šฉ

์ต๋ช… ํด๋ž˜์Šค๋ž€ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ƒ์„ฑ๊ณผ ๊ตฌํ˜„๋ถ€๋ถ„์€ ์กด์žฌํ•˜์ง€๋งŒ class๋ผ๋Š” ํ‚ค์›Œ๋“œ๋„ ์—†๊ณ  ํด๋ž˜์Šค์˜ ์ด๋ฆ„๋„ ์—†๋‹ค.

์“ฐ์ด๋Š” ์‹œ์ ์— ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์ต๋ช… ํด๋ž˜์Šค๋Š” ์žฌ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์ต๋ช… ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๋กœ์„œ ๋‹ค๋ฃจ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋ณด๋‹ค๋Š” 1ํšŒ์„ฑ ์ด๊ฑฐ๋‚˜ ์งง์€ ๊ตฌํ˜„๋ถ€๋ฅผ ๊ฐ€์ง„ ๊ฐ„๋‹จํ•œ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ๊ตณ์ด ํด๋ž˜์Šค๋กœ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์— ์ข€ ๋” ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  ...
@Override
public Iterator<E> iterator() {
  return new Iterator<>() {   // ์ต๋ช… ํด๋ž˜์Šค
    Node<E> cursor = LinkedList.this.first;

    @Override
    public boolean hasNext() {
      return cursor != null;
    }

    @Override
    public E next() {
      E value = cursor.value;
      cursor = cursor.next;
      return value;
    }
  };
}

์†Œ์Šค์ฝ”๋“œ

771eaae

์ •๋ฆฌ

์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”์—์„  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.

๋ฉ”์„œ๋“œ ๋ฐ–์—์„œ๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์†Œ๋“œ ์•ˆ์— ์ •์˜ํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ๊ธธ๋‹ค๋ฉด ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ ๋‹ค.

  • ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋ฉด ๐Ÿ‘‰ non-static class
  • ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๐Ÿ‘‰ static nested class
  • ๋ฉค๋ฒ„ ํด๋ž˜์Šค๊ฐ€ ํ•œ ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ๋งŒ ์“ฐ์ด๋ฉด์„œ ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ง€์ ์ด ๋‹จ ํ•œ ๊ณณ์ด๊ณ  ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ์“ฐ๊ธฐ์— ์ ํ•ฉํ•œ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค๋ฉด ๐Ÿ‘‰ anonymous class

reference

๋ฐฉ๋ฌธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋Œ“๊ธ€,์ง€์ ,ํ”ผ๋“œ๋ฐฑ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜Š

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ