Post

โ›“๏ธ Java Design-Pattern XIV - Visitor

โ›“๏ธ Java Design-Pattern XIV - Visitor

๐Ÿ“— ใ€ŽJAVA ์–ธ์–ด๋กœ ๋ฐฐ์šฐ๋Š” ๋””์ž์ธ ํŒจํ„ด : ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” GoF์˜ 23๊ฐ€์ง€ ๋””์ž์ธ ํŒจํ„ดใ€๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Visitor ํŒจํ„ด์ด๋ž€?

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

์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ

  • ๋‹ค์Œ์€ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์•ˆ์„ ๋ฐฉ๋ฌธ์ž๊ฐ€ ๋Œ์•„๋‹ค๋‹ˆ๋ฉฐ ํŒŒ์ผ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

Visitorย ํด๋ž˜์Šค

1
2
3
4
public abstract class Visitor {
	public abstract void visit(File file);
    public abstract void visit(Directory directory);
}
  • ๋ฐฉ๋ฌธ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค.
  • ์ด ๋ฐฉ๋ฌธ์ž๋Š” ๋ฐฉ๋ฌธํ•˜๋Š” ๊ณณ์˜ ๋ฐ์ดํ„ฐ๊ตฌ์กฐ์— ์˜์กดํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š”ย File๊ณผย Directory์— ํ•ด๋‹นํ•œ๋‹ค.
  • visitย ๋ฉ”์†Œ๋“œ๊ฐ€ ์˜ค๋ฒ„๋กœ๋“œ ๋˜์–ด ์žˆ๋‹ค.

Elementย ์ธํ„ฐํŽ˜์ด์Šค

1
2
3
public interface Element {
	public abstract void accept(Visitor v);
}
  • ๋ฐฉ๋ฌธ์ž๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

Entryย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
public abstract class Entry implements Element {
	public abstract String getName();
    public abstract int getSize();
    
    @Override
    public String toString() {
    	return getName() + " (" + getSize() + ")";
    }
}
  • Elementย ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค.
  • ์‹ค์ œ๋กœ ์ด ํด๋ž˜์Šค๋ฅผ ๊ตฌ์ฒดํ™”ํ•˜๋Š” ๊ฒƒ์€ย Fileย ๋˜๋Š”ย Directoryย ํด๋ž˜์Šค์ด๋‹ค.

Fileย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class File extends Entry {
	private String name;
	private int size;
    
    public File(String name, int size) {
    	this.name = name;
        this.size = size;
    }
    
    @Override
    public String getName() {
    	return name;
    }
    
    @Override
    public int getSize() {
    	return size;
    }
    
    @Override
    public void accept(Visitor v) {
    	v.visit(this);
    }
}
  • acceptย ๋ฉ”์†Œ๋“œ๋Š” ๋ฐฉ๋ฌธ์ž์˜ย visitย ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ๋ฐฉ๋ฌธํ•œย Fileย ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐฉ๋ฌธ์ž์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.

Directoryย ํด๋ž˜์Šค

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
33
34
35
36
37
38
39
40
41
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Directory extends Entry implements Iterable<Entry> {
	private String name;
    private List<Entry> directory = new ArrayList<>();

	public Directory(String name) {
    	this.name = name;
    }
	
    @Override
    public String getName() {
    	return name;
    }
    
    @Override
    public int getSize() {
    	int size = 0;
        for (Entry entry : directory) {
        	size += entry.getSize();
        }
        return size;
    }
    
    public Entry add(Entry entry) {
    	directory.add(entry);
        return this;
    }
    
    @Override
    public Iterator<Entry> iterator() {
    	return directory.iterator();
    }
    
    @Override
    public void accept(Visitor v) {
    	v.visit(this)
    }
}
  • iteratorย ๋ฉ”์†Œ๋“œ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์—”ํŠธ๋ฆฌ(ํŒŒ์ผ, ๋””๋ ‰ํ„ฐ๋ฆฌ) ๋ชฉ๋ก์„ ์–ป๊ธฐ ์œ„ํ•œย Iterator<Entry>๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • acceptย ๋ฉ”์†Œ๋“œ๋Š” ๋ฐฉ๋ฌธ์ž์˜ย visitย ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ๋ฐฉ๋ฌธํ•œย Directoryย ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐฉ๋ฌธ์ž์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.

ListVisitorย ํด๋ž˜์Šค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ListVisitor extends Visitor {
	private String currentDir = "";
    
    @Override
    public void visit(File file) {
    	System.out.println(currentDir + "/" + file);
    }
    
    @Override
    public void visit(Directory directory) {
    	System.out.println(currentDir + "/" + directory);
        String saveDir = currentDir;
        currentDir = currentDir + "/" + directory.getName();
        for (Entry entry : directory) {
        	entry.accept(this);
        }
        currentDir = saveDir;
    }
}
  • Visitorย ํด๋ž˜์Šค๋ฅผ ๊ตฌ์ฒดํ™”ํ•œ ํ•˜์œ„ ํด๋ž˜์Šค์ด๋‹ค.
  • ์ฆ‰ ์‹ค์ œ ๋ฐฉ๋ฌธ์ž ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • currentDirย ํ•„๋“œ์—๋Š” ํ˜„์žฌ ๋ฐ”๋ผ๋ณด๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์„ ์ €์žฅํ•œ๋‹ค.
  • visitย ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ ์ธ์Šคํ„ด์Šค์— ํ•ด์•ผ ํ•  ์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ์ˆ ํ•˜์˜€๋‹ค.
  • ๊ฒฐ๊ตญย acceptย ๋ฉ”์†Œ๋“œ์™€ย visitย ๋ฉ”์†Œ๋“œ๋Š” ์„œ๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋ณดํ†ต ์žฌ๊ท€์  ํ˜ธ์ถœ์€ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ˜๋ฉด, ์ด๋Š” ์ƒ๋‹นํžˆ ๋ณต์žกํ•œ ์žฌ๊ท€์  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด๋‹ค.

Mainย ํด๋ž˜์Šค

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
33
34
35
36
37
public class Main {
	public static void main(String[] args) {
    	System.out.println("Making root entries...");
        Directory rootDir = new Directory("root");
        Directory binDir = new Directory("bin");
        Directory tmpDir = new Directory("tmp");
        Directory usrDir = new Directory("usr");
        
        rootDir.add(binDir);
        rootDir.add(tmpDir);
        rootDir.add(usrDir);
        
        binDir.add(new File("vi", 10000));
        binDir.add(new File("latex", 20000));
    	
        rootDir.accept(new ListVisitor());
        
        System.out.println();
        
        System.out.println("Making user entries...");
        Directory youngjin = new Directory("youngjin");
        Directory gildong = new Directory("gildong");
        Directory dojun = new Directory("dojun");
        
        usrDir.add(youngjin);
        usrDir.add(gildong);
        usrDir.add(dojun);
        
        youngjin.add(new File("diary.html", 100));
        youngjin.add(new File("Composite.java", 200));
        gildong.add(new File("memo.txt", 300));
		dojun.add(new File("game.doc", 400));
        dojun.add(new File("junk.mail", 500));
        
        rootDir.accept(new ListVisitor());
    }
}
  • Compositeย ํŒจํ„ด์˜ย Mainย ํด๋ž˜์Šค์™€ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค.
  • ๋‹จย Compositeย ํŒจํ„ด์—์„œ๋Š”ย printList๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฐ˜๋ฉด, ํ•ด๋‹น ํŒจํ„ด์—์„œ๋Š” ๋ฐฉ๋ฌธ์ž๊ฐ€ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๋””๋ ‰ํ„ฐ๋ฆฌ ์ถœ๋ ฅ๋„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋‚ด์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Visitor์™€ย Element์˜ ์ƒํ˜ธ ํ˜ธํก

  • File,ย Directoryย ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด์„œ๋Š”ย acceptย ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  • acceptย ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ ์ธ์Šคํ„ด์Šค์—์„œ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.
  • ListVisitor์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด์„œ๋Š”ย visitย ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  • visitย ๋ฉ”์†Œ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ํ•˜๋‚˜์˜ย ListVisitorย ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ด๋‹ค.
  • ๋ฐฉ๋ฌธ์žย ListVisitor์—๊ฒŒย visitย ๋ฉ”์†Œ๋“œ ์ฒ˜๋ฆฌ๊ฐ€ ์ง‘์ค‘๋˜๋Š” ๋ชจ์Šต์„ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.

Visitย ํŒจํ„ด์˜ ๋“ฑ์žฅ์ธ๋ฌผ

Visitorย ํด๋ž˜์Šค

  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค ๋ณ„๋กœย visitย ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค.
  • ๋ฐฉ๋ฌธ์žย Visitorย ์—ญํ• ์„ ๋งก๋Š”๋‹ค.

ListVisitorย ํด๋ž˜์Šค

  • ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฌธ์žย ConcreteVisitorย ์—ญํ• ์„ ๋งก์•„ ๋ฐฉ๋ฌธ์ž์˜ ์ธํ„ฐํŽ˜์ด์Šคย API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ListVisitor์—์„œย currentDirย ํ•„๋“œ ๊ฐ’์ด ๋ณ€ํ™”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผย visitย ๋ฉ”์†Œ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์— ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฌธ์ž ์—ญํ• ์˜ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

Elementย ์ธํ„ฐํŽ˜์ด์Šค

  • ์š”์†Œย Elementย ์—ญํ• ์„ ๋งก์•„ ๋ฐฉ๋ฌธ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•  ๊ณณ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฐฉ๋ฌธ์ž๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š”ย acceptย ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•œ๋‹ค.

File,ย Directorย ํด๋ž˜์Šค

  • Element์˜ ์ธํ„ฐํŽ˜์ด์Šคย API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์š”์†Œย ConcreteElementย ์—ญํ• ์„ ๋งก์•˜๋‹ค.

Directoryย ํด๋ž˜์Šค

  • ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ๊ตฌ์ฒด์ ์ธ ์š”์†Œ ์—ญํ• ๊ณผ ํ•จ๊ป˜ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์กฐย ObjectStructureย ์—ญํ• ์„ ๋งก์•˜๋‹ค.
  • ์ฆ‰ 1์ธ 2์—ญ์„ ๋งก์•˜๋‹ค.
  • ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฌธ์ž๊ฐ€ ๊ฐ๊ฐ์˜ ์š”์†Œ๋ฅผ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ๋‹ค.
  • ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š”ย iteratorย ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์š”์†Œ ์ง‘ํ•ฉ์„ ๋‹ค๋ฃฌ๋‹ค.

์ฑ…์—์„œ ์ œ์‹œํ•˜๋Š” ํžŒํŠธ

์™œ ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ ์ผ์„ ํ•˜๋Š”๊ฐ€?

  • element๋Š”ย visitor๋ฅผย acceptย ํ•˜๊ณ ,ย visitor๋Š”ย element๋ฅผย visitย ํ•œ๋‹ค.
  • ์ด๊ฒƒ์„ ๋”๋ธ” ๋””์ŠคํŒจ์น˜๋ผ๊ณ  ํ•œ๋‹ค.
  • Visitorย ํŒจํ„ด์˜ ๋ชฉ์ ์€ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.ย 
  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ์š”์†Œ๋ฅผ ์ง‘ํ•ฉ์œผ๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์š”์†Œ ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ๊ทธ ์ฒ˜๋ฆฌ๋Š” ๋ฐฉ๋ฌธ์žย API์™€ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฌธ์ž๋ฅผ ๋‘์–ดย File,ย Directoryย ํด๋ž˜์Šค์˜ ๋ถ€ํ’ˆ์œผ๋กœ์„œ์˜ ๋…๋ฆฝ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ€๋ น ์ฒ˜๋ฆฌ ๋‚ด์šฉ์„ย File,ย Directoryย ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ฒ„๋ฆด ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉดย File,ย Directoryย ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

The Open-Closed Principle : ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ์—ด๊ณ , ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซ๋Š”๋‹ค.

  • OCPย ์›์น™์— ์˜ํ•˜๋ฉด ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋Š” ํ•œ ํ™•์žฅ์„ ํ—ˆ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ๋™์‹œ์— ํ™•์žฅํ•  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.
  • ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์š”๊ตฌ๋Š” ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ์ชฝ์œผ๋กœ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ™”ํ•œ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ์— ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์—†์œผ๋ฉด ๊ณค๋ž€ํ•˜๊ณ , ์ด๋ฏธ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธ๊นŒ์ง€ ๋งˆ์นœ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ’ˆ์งˆ์„ ๋–จ์–ด๋œจ๋ฆด ์œ„ํ—˜์ด ์žˆ๋‹ค.
  • ๊ถ๊ทน์ ์œผ๋กœ๋Š”ย OCPย ์›์น™์ด ๋””์ž์ธ ํŒจํ„ด, ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ๋ชฉ์ ์ด๋‹ค.

์—ญํ•  ์ถ”๊ฐ€

  • ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฌธ์ž ์—ญํ•  ์ถ”๊ฐ€๋Š” ์‰ฝ๋‹ค.
  • ๊ตฌ์ฒด์ ์ธ ์ฒ˜๋ฆฌ๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฌธ์ž ์—ญํ• ์— ๋งก๊ธฐ๊ณ , ๊ทธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ตฌ์ฒด์ ์ธ ์š”์†Œ ์—ญํ• ์„ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋ฐ˜๋ฉด ๊ตฌ์ฒด์ ์ธ ์š”์†Œ ์—ญํ•  ์ถ”๊ฐ€๋Š” ์–ด๋ ต๋‹ค.
  • ๊ฐ€๋ นย Entryย ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋กœย Deviceย ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜๋ฉดย Visitorย ํด๋ž˜์Šค์˜ย visit(Device device)ย ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ ,ย Visitorย ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์— ๋ชจ๋‘ย visit(Device device)ย ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๋ฐฉ๋ฌธ์ž๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋ฌด์—‡์ด ํ•„์š”ํ•œ๊ฐ€?

  • ๋ฐฉ๋ฌธ์ž๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•˜์—ฌ ๋™์ž‘ํ•œ๋‹ค.
  • ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์–ป์ง€ ๋ชปํ•˜๋ฉด ๋ฐฉ๋ฌธ์ž๊ฐ€ ์ œ๋Œ€๋กœ ์ผ์„ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ฐ˜๋ฉด ๊ณต๊ฐœํ•˜์ง€ ๋ง์•„์•ผ ํ•  ์ •๋ณด๊นŒ์ง€ ๊ณต๊ฐœํ•ด ๋ฒ„๋ฆฌ๋ฉด, ๋ฏธ๋ž˜์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค.
  • ๊ฐ€๋ น ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š”ย visit(Directory directory)ย ์•ˆ์—์„œ ๊ฐ๊ฐ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ์—”ํŠธ๋ฆฌ์— ๋Œ€ํ•ดย acceptย ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ดย iteratorย ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.
This post is licensed under CC BY 4.0 by the author.