jacketList

๋”๋ธ” ๋””์ŠคํŒจ์น˜(Double Dispatch) ์™€ ๋ฐฉ๋ฌธ์ž ํŒจํ„ด(Visitor Pattren) ๋ณธ๋ฌธ

Java

๋”๋ธ” ๋””์ŠคํŒจ์น˜(Double Dispatch) ์™€ ๋ฐฉ๋ฌธ์ž ํŒจํ„ด(Visitor Pattren)

ukkkk7 2024. 4. 16. 10:32
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ” ๋”๋ธ” ๋””์ŠคํŒจ์น˜(Double Dispatch)

๋”๋ธ” ๋””์ŠคํŒจ์น˜๋Š” Dynamic Dispatch๋ฅผ ๋‘ ๋ฒˆ ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

situation

์šฐ์ฃผ์„ ์„ ํ–‰์„ฑ์— ์ฐฉ๋ฅ™์‹œํ‚ค๋Š” ์ƒํ™ฉ

์šฐ์ฃผ์„ ์„ ํ–‰์„ฑ์— ์ฐฉ๋ฅ™์‹œํ‚ค๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•˜์„ธ์š”

 

public interface Planet {
}

public class Mercury implements Planet {
}

public class Venus implements Planet {
}

public class Earth implements Planet {
}


public interface SpaceShip {
    void landing(Planet planet);
    void landing(Mercury planet);
    void landing(Venus planet);
    void landing(Earth planet);
}

 

 ๊ฐ๊ฐ์˜ ํ–‰์„ฑ๋“ค์„ ๋งŒ๋“ค๊ณ  spaceship ์ธํ„ฐํŽ˜์ด์Šค์—์„œ landing๋ฉ”์†Œ๋“œ๋ฅผ ํ–‰์„ฑ๋งˆ๋‹ค ์˜ค๋ฒ„๋กœ๋”ฉ ํ–ˆ๋‹ค.

๊ฐ ํ–‰์„ฑ์€ ์ฐฉ๋ฅ™๋ฐฉ์‹์„ ๋‹ค๋ฅด๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด์ œ ์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํƒ์‚ฌ์„ ์„ ๋งŒ๋“ค์–ด ๋ณด์ž

 

public class UkSpaceShip implements SpaceShip{

    @Override
    public void landing(Planet planet) {
        System.out.println("๊ธฐ๋ณธ ์ฐฉ๋ฅ™ ๋ฐฉ์‹");

    }

    @Override
    public void landing(Mercury planet) {
        System.out.println("๋‚™ํ•˜ ์žฅ๋น„๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.");
        System.out.println("๋ฐ‘์œผ๋กœ ๊ณต๊ธฐ๋ฅผ ๋ฟœ์Šต๋‹ˆ๋‹ค.");
        System.out.println("์ˆ˜์„ฑ ์ฐฉ๋ฅ™.");
    }

    @Override
    public void landing(Venus planet) {
        System.out.println("๋‚™ํ•˜์‚ฐ์„ ํŽผ์นฉ๋‹ˆ๋‹ค.");
        System.out.println("๊ธˆ์„ฑ ์ฐฉ๋ฅ™");

    }

    @Override
    public void landing(Earth planet) {
        System.out.println("๋‚™ํ•˜ ์žฅ์น˜๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.");
        System.out.println("์†๋„๊ฐ€ ์ค„์–ด๋“ค๋ฉด ์šด์ „์„์ด ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค.");
        System.out.println("๋ฌผ์— ๋–จ์–ด์ง€๊ธธ ๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค.");
        System.out.println("์ง€๊ตฌ ์ฐฉ๋ฅ™.");
    }
}

 

์ด์ œ ๋งŒ๋“ค์–ด์ง„ ํƒ์‚ฌ์„ ์„ Mainํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ฐฉ๋ฅ™์‹œ์ผœ๋ณด์ž

 

import java.util.ArrayList;
import java.util.List;
import org.example.planet.Earth;
import org.example.planet.Mercury;
import org.example.planet.Planet;
import org.example.planet.Venus;

public class Main {
    public static void main(String[] args) {
        SpaceShip ship = new UkSpaceShip();
        // Mercury, Venus, Earch ์ธ์Šคํ„ด์Šค๋ฅผ planets์— ์ถ”๊ฐ€ํ•œ๋‹ค.
        List<Planet> planets = new ArrayList<>();
        planets.add(new Mercury());
        planets.add(new Venus());
        planets.add(new Earth());
		
        // ๊ฐ๊ฐ์˜ ํ–‰์„ฑ์— UkSpaceShip ์ธ์Šคํ„ด์Šค๋ฅผ landingํ•œ๋‹ค.
        for (Planet planet : planets) {
            ship.landing(planet);
        }
    }
}

 

 

๊ฒฐ๊ณผ๋Š”? 

 

๋ถ„๋ช… ํ–‰์„ฑ๋งˆ๋‹ค ์ฐฉ๋ฅ™ ๋กœ์ง์„ ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ ์ „๋ถ€ ๊ธฐ๋ณธ ๋กœ์ง์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋‹ค.

 

์™œ๋ƒํ•˜๋ฉด ship.landing(planet) ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค€ planet์€ planet ํƒ€์ž…์˜ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค planet์„ Mercury, Venus, Earth๊ฐ€ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์ง€๋งˆ ์ž๋ฐ”์˜ ์ž…์žฅ์—์„œ๋Š” ์ด๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€๊ฐ™์ด ๊ธฐ๋ณธ ๋กœ์ง์ด ์‹คํ–‰๋œ ๊ฒƒ์ด๋‹ค.

 

์ด์™€๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

 

๐Ÿ’ก๋ฐฉ๋ฒ• 1 - planet ๊ฐ์ฒด๊ฐ€ ๊ฐ ํ–‰์„ฑ์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ํ™•์ธํ•˜๊ธฐ

public class Main {
    public static void main(String[] args) {
        SpaceShip ship = new UkSpaceShip();
        List<Planet> planets = new ArrayList<>();
        planets.add(new Mercury());
        planets.add(new Venus());
        planets.add(new Earth());

        for (Planet planet : planets) {
        	if (planet instanceof Mercury) {
				ship.landing((Mercury) planet);
            } else if (planet instanceof Venus) {
            ... ์ƒ๋žต
            }
        }
    }
}

 

ํ•˜์ง€๋งŒ ์œ„์™€๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ƒˆ๋กœ์šด ํ–‰์„ฑ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ์ˆ˜์ •์„ ํ•ด์•ผํ•  ๋ฟ๋”๋Ÿฌ ์ฝ”๋“œ์˜ ์–‘์ด ๋งŽ์•„์ง€๋Š” ์ˆœ๊ฐ„ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ฌธ์ œ์ ์ด ์ƒ๊ธด๋‹ค.

 

๐Ÿ’ก๋ฐฉ๋ฒ• 2 - Double Dispatch

 

public interface Planet {
	// ์ถ”์ƒ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    void landed(SpaceShip spaceShip);

}
import org.example.SpaceShip;

public class Mercury implements Planet {
    @Override
    public void landed(SpaceShip spaceShip) {
        spaceShip.landing(this);
    }
}


import org.example.SpaceShip;

public class Venus implements Planet {
    @Override
    public void landed(SpaceShip spaceShip) {
        spaceShip.landing(this);
    }
}


import org.example.SpaceShip;

public class Earth implements Planet {
    @Override
    public void landed(SpaceShip spaceShip) {
        spaceShip.landing(this);
    }
}


import java.util.ArrayList;
import java.util.List;
import org.example.planet.Earth;
import org.example.planet.Mercury;
import org.example.planet.Planet;
import org.example.planet.Venus;

public class Main {
    public static void main(String[] args) {
        SpaceShip ship = new UkSpaceShip();
        List<Planet> planets = new ArrayList<>();
        planets.add(new Mercury());
        planets.add(new Venus());
        planets.add(new Earth());

        for (Planet planet : planets) {
//            ship.landing(planet);

			// ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค
            planet.landed(ship);
            System.out.println("\n");
        }
    }
}

 

 

๊ฒฐ๊ณผ๋Š”?

 

 

์œ„์™€๊ฐ™์ด ๊ฐ ํ–‰์„ฑ๋ณ„๋กœ ๋กœ์ง์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ˆ˜์ • ์ „ ๊ตฌ์กฐ์™€ ๋”๋ธ” ๋””์ŠคํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•œ ๊ตฌ์กฐ๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด

 

์ˆ˜์ • ์ „ ๊ตฌ์กฐ
๋”๋ธ” ๋””์ŠคํŒจ์น˜๋กœ ์ˆ˜์ •ํ•œ ๊ตฌ์กฐ

 

 

์ž๋ฐ”์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ํ˜•ํƒœ๋ฅผ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋˜๋ฉด ๋‚ด๋ถ€์—์„œ instanceOf ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ปจ๋ฒ„ํŒ…์„ ํ•ด์ค˜์•ผ๋งŒ ํ•œ๋‹ค.

๋•Œ๋ฌธ์— planet ๊ตฌํ˜„์ฒด์—์„œ landed๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  landed๋ฉ”์†Œ๋“œ์—์„œ SpaceShip  ๊ฐ์ฒด์˜ landing๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ this๋ผ๋Š” ๊ฐ๊ฐ์˜ ํ–‰์„ฑ์„ ๊ตฌํ˜„์ฒด๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ Double Dispatch๋ผ๊ณ  ํ•œ๋‹ค.

 

์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋ฉด

 

newSpaceShip์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ๋„ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์ด ํด๋ž˜์Šค๋งŒ ๊ฐˆ์•„๋ผ์šฐ๋ฉด ๋œ๋‹ค.

 

import org.example.planet.Earth;
import org.example.planet.Mercury;
import org.example.planet.Planet;
import org.example.planet.Venus;

public class NewSpaceShip implements SpaceShip {

    @Override
    public void landing(Planet planet) {
        System.out.println("๊ธฐ๋ณธ ์ฐฉ๋ฅ™ ๋ฐฉ์‹");
    }

    @Override
    public void landing(Mercury planet) {
        System.out.println("๊ธฐ์ˆ ๋ฐœ์ „์œผ๋กœ ๊ทธ๋ƒฅ ์ฐฉ๋ฅ™ํ•ฉ๋‹ˆ๋‹ค");
        System.out.println("์ˆ˜์„ฑ ์ฐฉ๋ฅ™");
    }

    @Override
    public void landing(Venus planet) {
        System.out.println("๊ธฐ์ˆ ๋ฐœ์ „์œผ๋กœ ๊ทธ๋ƒฅ ์ฐฉ๋ฅ™ํ•ฉ๋‹ˆ๋‹ค");
        System.out.println("๊ธˆ์„ฑ ์ฐฉ๋ฅ™");

    }

    @Override
    public void landing(Earth planet) {
        System.out.println("์ง€๊ตฌ ์ฐฉ๋ฅ™");
    }
}
public class Main {
    public static void main(String[] args) {
//        SpaceShip ship = new UkSpaceShip();
        SpaceShip ship = new NewSpaceShip();

        List<Planet> planets = new ArrayList<>();
        planets.add(new Mercury());
        planets.add(new Venus());
        planets.add(new Earth());

        for (Planet planet : planets) {
            planet.landed(ship);
            System.out.println("\n");
        }
    }
}

 

 

Planet์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ „์ œํ•˜์— ํƒ์‚ฌ์„  ํด๋ž˜์Šค๋ฅผ ์–ผ๋งˆ๋“ ์ง€ ๋ณ€๊ฒฝํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฅผ ํ†ตํ•ด OCP ์›์น™์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

๐Ÿ” ๋ฐฉ๋ฌธ์ž ํŒจํ„ด(Visitor Pattern)

๋ฐฉ๋ฌธ์ž ํŒจํ„ด(Visitor Pattern)์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ ๊ฐ์ฒด์˜ ๊ตฌ์กฐ์™€ ๊ทธ ๊ตฌ์กฐ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

๊ฐ์ฒด์˜ ๊ตฌ์กฐ์™€ ๊ตฌ์กฐ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ๊ฐ์ฒด์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋Š”๋ฉฐ ๊ฐœ๋ฐฉ-ํ์‡ (OCP)์›์น™์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•œ๊ฐ€์ง€์ด๋‹ค.

 

 

Visitor ํŒจํ„ด ์˜ˆ์ œ

์ž๋ฐ”์—์„œ ๋ฐฉ๋ฌธ์ž ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋“ค์ด ํ•„์š”ํ•˜๋‹ค.

 

  1.  Element(์š”์†Œ) ์ธํ„ฐํŽ˜์ด์Šค : ๋ฐฉ๋ฌธ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•  ๊ฐ์ฒด๋“ค์˜ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. accept๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ, ๋ฐฉ๋ฌธ์ž๊ฐ€ ์ž์‹ ์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  2. ConcreteElement(๊ตฌ์ฒด์ ์ธ ์š”์†Œ) ํด๋ž˜์Šค : Element ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋“ค์ด๋‹ค. ๋ฐฉ๋ฌธ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•  ์‹ค์ œ ๊ฐ์ฒด๋“ค 
  3. Visitor(๋ฐฉ๋ฌธ์ž) ์ธํ„ฐํŽ˜์ด์Šค : Element ๊ฐ์ฒด๋“ค์„ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์„ ์„ ์–ธํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
  4. ConcreteVisitor(๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฌธ์ž) ํด๋ž˜์Šค : Visitor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋“ค์ด๋‹ค. Element ๊ฐ์ฒด๋“ค์„ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•๋“ค์„ ๊ตฌํ˜„ํ•œ๋‹ค.

 

์œ„์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž

public interface Visitor {
    int visit(Book book);
    int visit(Music music);
    int visit(Movie movie);
}

 

๋จผ์ €, ๋ฐฉ๋ฌธ์ž(Visitor) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ด์ค€๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ๊ฐ์˜ ์ƒํ’ˆ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„๋  visit ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค.

public interface Element {
    int accept(Visitor visitor);
}

 

๊ฐ๊ฐ์˜ Element ์ƒํ’ˆ ํด๋ž˜์Šค(Book, Music, Movie)๋ฅผ ์ •์˜ํ•œ๋‹ค. ๊ฐ ํด๋ž˜์Šค๋Š” ๊ฐ€๊ฒฉ(price) ์†์„ฑ์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, Visitor์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ตฌํ˜„ํ•œ visit ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค.

public class Book implements Element {
    private int price;

    public Book(int price) {
        this.price = price;
    }

    public int getPrice() {
        return price;
    }

    @Override
    public int accept(Visitor visitor) {
        return visitor.visit(this);
    }
}

public class Music implements Element {
    private int price;

    public Music(int price) {
        this.price = price;
    }

    public int getPrice() {
        return price;
    }

    @Override
    public int accept(Visitor visitor) {
        return visitor.visit(this);
    }
}

public class Movie implements Element {
    private int price;

    public Movie(int price) {
        this.price = price;
    }

    public int getPrice() {
        return price;
    }

    @Override
    public int accept(Visitor visitor) {
        return visitor.visit(this);
    }
}

 

public class PriceCalculator implements Visitor {

    @Override
    public int visit(Book book) {
        return book.getPrice();
    }

    @Override
    public int visit(Music music) {
        return music.getPrice() * 2;
    }

    @Override
    public int visit(Movie movie) {
        return movie.getPrice() * 3;
    }
}

 

Visitor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ Visitor ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ์˜ ์ƒํ’ˆ์„ ๋ฐฉ๋ฌธํ•˜์—ฌ ๊ฐ€๊ฒฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค.

public class Main {
    public static void main(String[] args) {
        Element book = new Book(10000);
        Element music = new Music(5000);
        Element movie = new Movie(15000);

        Visitor visitor = new PriceCalculator();

        int totalPrice = book.accept(visitor) + music.accept(visitor) + movie.accept(visitor);

        System.out.println("book pirce = " + book.accept(visitor));
        System.out.println("music pirce = " + music.accept(visitor));
        System.out.println("movie pirce = " + movie.accept(visitor));
        System.out.println("Total Price = " + totalPrice);

    }
}

 

 

์‹คํ–‰๊ฒฐ๊ณผ๋Š”?

 

Book, Music, Movie ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , PriceCalculatorํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ์ƒํ’ˆ ์ธ์Šคํ„ด์Šค์—์„œ๋Š” accept ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ PriceCalculator ํด๋ž˜์Šค์˜ visit ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ Visitor ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ƒˆ๋กœ์šด ์ƒํ’ˆ์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค, ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ PriceCalculator ํด๋ž˜์Šค์˜ visit ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•จ์œผ๋กœ์จ ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

references

https://shan0325.tistory.com/41

https://velog.io/@iamtaehoon/y3uuyvw5

728x90
๋ฐ˜์‘ํ˜•