JAVA

JAVA 디자인패턴 - 비지터(Visitor) 패턴의 정의, 장점, 구현

TECH 톡마스터 2023. 7. 12.

[ 목차 ]

     

    JAVA 디자인패턴 - 비지터(Visitor) 패턴의 정의, 장점, 구현
    JAVA 디자인패턴 - 비지터(Visitor) 패턴의 정의, 장점, 구현

    안녕하세요, 자바 프로그래밍을 사랑하는 여러분! 오늘은 디자인 패턴 중 하나인 비지터(Visitor) 패턴에 대해 자세히 알아볼까요? 디자인 패턴은 우리의 코드를 더 유연하고 효율적으로 만드는 데 큰 도움이 되기 때문에, 시간을 내어 정독해 보시면 분명 도움 될 거예요!

    비지터 패턴의 이해와 활용 방법

    1. 비지터 패턴이란 무엇인가요?

    비지터 패턴은 객체 지향 프로그래밍에서 행위 디자인 패턴 중 하나로, 데이터 구조와 처리 로직을 분리하는 데 사용되는 패턴입니다. 이를 통해 데이터 구조와 처리 로직의 유연성과 확장성을 높일 수 있죠!

    2. 비지터 패턴의 핵심 구성 요소

    • Visitor 인터페이스: 처리 로직을 구현하기 위한 인터페이스로, 각 요소를 처리하는 추상 메서드를 정의합니다.
    public interface ShapeVisitor {
        void visitCircle(Circle circle);
        void visitRectangle(Rectangle rectangle);
        void visitTriangle(Triangle triangle);
    }
    
    public class AreaCalculator implements ShapeVisitor {
        @Override
        public void visitCircle(Circle circle) {
            double area = Math.PI * Math.pow(circle.getRadius(), 2);
            System.out.printf("원의 면적: %.2f\n", area);
        }
    
        @Override
        public void visitRectangle(Rectangle rectangle) {
            int area = rectangle.getWidth() * rectangle.getHeight();
            System.out.println("사각형의 면적: " + area);
        }
    
        @Override
        public void visitTriangle(Triangle triangle) {
            double area = 0.5 * triangle.getBase() * triangle.getHeight();
            System.out.println("삼각형의 면적: " + area);
        }
    }
    • ConcreteVisitor 클래스: Visitor 인터페이스를 구현한 클래스로, 실제 처리 로직이 구현되어 있습니다.
    public class VisitorPatternDemo {
        public static void main(String[] args) {
            List<Shape> shapes = Arrays.asList(
                    new Circle(5),
                    new Rectangle(4, 5),
                    new Triangle(5, 6)
            );
    
            AreaCalculator areaCalculator = new AreaCalculator();
            
            for (Shape shape : shapes) {
                shape.accept(areaCalculator);
            }
        }
    }
    • Element 인터페이스: 데이터 구조에 포함된 요소들의 인터페이스로, Visitor를 받아들이는 메서드를 정의합니다.
    public interface Shape {
        void accept(ShapeVisitor visitor);
    }
    • ConcreteElement 클래스: Element 인터페이스를 구현한 클래스로, 실제 데이터 요소들의 구현체입니다.
    public class Circle implements Shape {
        private int radius;
    
        public Circle(int radius) {
            this.radius = radius;
        }
    
        public int getRadius() {
            return radius;
        }
    
        @Override
        public void accept(ShapeVisitor visitor) {
            visitor.visitCircle(this);
        }
    }
    
    public class Rectangle implements Shape {
        private int width, height;
    
        public Rectangle(int width, int height) {
            this.width = width;
            this.height = height;
        }
    
        public int getWidth() {
            return width;
        }
    
        public int getHeight() {
            return height;
        }
    
        @Override
        public void accept(ShapeVisitor visitor) {
            visitor.visitRectangle(this);
        }
    }
    
    public class Triangle implements Shape {
        private int base, height;
    
        public Triangle(int base, int height) {
            this.base = base;
            this.height = height;
        }
    
        public int getBase() {
            return base;
        }
    
        public int getHeight() {
            return height;
        }
    
        @Override
        public void accept(ShapeVisitor visitor) {
            visitor.visitTriangle(this);
        }
    }
    public class VisitorPatternDemo {
        public static void main(String[] args) {
            List<Shape> shapes = Arrays.asList(
                    new Circle(5),
                    new Rectangle(4, 5),
                    new Triangle(5, 6)
            );
    
            AreaCalculator areaCalculator = new AreaCalculator();
            
            for (Shape shape : shapes) {
                shape.accept(areaCalculator);
            }
        }
    }

    3. 비지터 패턴의 장단점

    비지터 패턴의 장점

    • 데이터 구조와 처리 로직이 분리되어 있어 확장성과 유연���이 높아집니다.
    • 새로운 처리 로직을 추가할 때 데이터 구조를 수정할 필요가 없습니다.
    • 필요한 처리 로직만 구현할 수 있어 코드를 간결하게 만들어줍니다.

    비지터 패턴의 단점

    • 새로운 데이터 요소가 추가될 경우, Visitor 인터페이스와 ConcreteVisitor 클래스를 수정해야 합니다.
    • 데이터 구조를 탐색할 때 추가 정보를 전달하기 힘듭니다.
    • 데이터 구조 내부에 있는 데이터를 변경하는 것이 어려울 수 있습니다.

    4. 비지터 패턴의 활용 사례

    비지터 패턴은 자주 변경되지 않는 데이터 구조에서 처리 로직이 자주 변경되는 경우, 제품 관리 시스템에서 여러 가지 환경(종류, 가격 등)의 조건에 따라 변하는 프로모션 로직 등에 활용됩니다. 또한 컴파일러를 만드는 데에도 활용되곤 합니다. 다양한 분야에서 비지터 패턴을 활용하면 복잡성을 줄이고 소스 코드의 가독성을 높일 수 있습니다.

     

    오늘 함께 자바 디자인 패턴 중 비지터 패턴에 대해서 알아보았습니다. 이제 비지터 패턴의 이해와 활용이 어느 정도 되셨을 겁니다. 앞으로도 다양한 디자인 패턴을 실전에서 활용해 보시며 프로그래밍 능력을 향상해 나가시기를 바랍니다. 그럼, 즐거운 코딩되세요!

     

    2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴

     

    디자인패턴 - 팩토리(Factory) 패턴

    2023.07.12 - [JAVA] - 디자인패턴 - 싱글톤(Singleton) 패턴 [ 목차 ] 안녕하세요. 이번에는 팩토리(Factory) 패턴에 대해서 알아보도록 하겠습니다. 1. 팩토리(Factory) 패턴 이란? 팩토리 패턴은 객체 생성을

    tech.dj-tiger.com

    2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴

     

    디자인패턴 - 팩토리(Factory) 패턴

    2023.07.12 - [JAVA] - 디자인패턴 - 싱글톤(Singleton) 패턴 [ 목차 ] 안녕하세요. 이번에는 팩토리(Factory) 패턴에 대해서 알아보도록 하겠습니다. 1. 팩토리(Factory) 패턴 이란? 팩토리 패턴은 객체 생성을

    tech.dj-tiger.com

    2023.07.12 - [JAVA] - 디자인패턴 - 어댑터(Adapter) 패턴

     

    디자인패턴 - 어댑터(Adapter) 패턴

    [ 목차 ] 안녕하세요. 오늘 알아볼 패턴은 어댑터(Adapter) 패턴입니다. 1. 어댑터(Adapter) 패턴 이란? 어댑터 패턴은 디자인 패턴 중 하나로, 서로 다른 인터페이스를 가진 클래스 또는 객체를 협력할

    tech.dj-tiger.com

    2023.07.12 - [JAVA] - JAVA 디자인패턴 - 싱글톤(Singleton) 패턴

     

    디자인패턴 - 싱글톤(Singleton) 패턴

    2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴 [ 목차 ] 안녕하세요. 자바에는 다양한 디자인 패턴이 존재하고, 각 패턴은 특정한 문제를 해결하기 위해 설계되었습니다. 적절한 디자인 패턴

    tech.dj-tiger.com

    2023.07.13 - [JAVA] - JAVA 디자인패턴 - 옵저버(Observer) 패턴

     

    JAVA 디자인패턴 - 옵저버(Observer) 패턴

    [ 목차 ] 안녕하세요. 이번에는 Java 디자인패턴 중 옵저버(Observer) 패턴에 대해서 알아보겠습니다. 1. 옵저버(Observer) 패턴이란? 옵저버 패턴은 디자인 패턴 중 하나로, 한 객체의 상태가 변화하면

    tech.dj-tiger.com

    2023.07.13 - [JAVA] - JAVA 디자인패턴 - 데코레이터(Decorator) 패턴

     

    JAVA 디자인패턴 - 데코레이터(Decorator) 패턴

    [ 목차 ] 안녕하세요. 오늘은 JAVA 디자인패턴 중 데코레이터(Decorator) 패턴에 대해서 알아보겠습니다. 1. 데코레이터(Decorator) 패턴 이란? 데코레이터 패턴은 기존 객체에 동적으로 새로운 기능을

    tech.dj-tiger.com

    2023.07.14 - [JAVA] - JAVA 디자인패턴 - 프록시(Proxy) 패턴

     

    JAVA 디자인패턴 - 프록시(Proxy) 패턴

    [ 목차 ] 안녕하세요. 이번에 알아볼 JAVA 디자인패턴은 프록시(Proxy) 패턴입니다. 1. 프록시(Proxy) 패턴 이란? 프록시 패턴은 객체의 대리자 또는 객체에 대한 참조를 제공하여 실제 객체의 내부 로

    tech.dj-tiger.com

    2023.07.14 - [JAVA] - JAVA 디자인 패턴 - 커맨드(Command) 패턴

     

    JAVA 디자인 패턴 - 커맨드(Command) 패턴

    안녕하세요. 오늘 알아볼 JAVA 디자인 패턴은 커맨드(Command) 패턴입니다. 1. 커맨드(Command) 패턴 이란? 커맨드 패턴은 요청을 객체로 캡슐화하여 메서드 호출에 의한 연동을 개선하고, 호출 정보를

    tech.dj-tiger.com

    2023.07.15 - [JAVA] - JAVA 디자인패턴 - 스트래티지(Strategy) 패턴

     

    JAVA 디자인패턴 - 스트래티지(Strategy) 패턴

    [ 목차 ] 안녕하세요. 오늘은 JAVA 디자인패턴 중 스트래티지(Strategy) 패턴에 대해서 작성해 보겠습니다. 스트래티지(Strategy) 패턴 이란? 스트래티지 패턴은 알고리즘 군을 정의한 다음 각각을 캡슐

    tech.dj-tiger.com

    2023.07.16 - [JAVA] - JAVA 디자인패턴 - 템플릿 메서드(Template Method) 패턴

     

    JAVA 디자인패턴 - 템플릿 메서드(Template Method) 패턴

    [ 목차 ] 안녕하세요. JAVA 디자인패턴 중 템플릿 메서드(Template Method) 패턴에 대해서 알아볼까요? 템플릿 메서드(Template Method) 패턴 이란? 템플릿 메서드 패턴은 알고리즘의 골격을 제공하고, 일부

    tech.dj-tiger.com

    2023.07.17 - [JAVA] - JAVA 디자인패턴 - 컴포지트(Composite) 패턴

     

    JAVA 디자인패턴 - 컴포지트(Composite) 패턴

    [ 목차 ] 안녕하세요. 이번에 알아볼 JAVA 디자인패턴은 컴포지트(Composite) 패턴입니다. 컴포지트(Composite) 패턴 이란? 컴포지트 패턴은 객체들의 조직을 트리 구조로 구성하여 전체-부분 계층을 표

    tech.dj-tiger.com

    2023.07.12 - [JAVA] - JAVA 디자인패턴 - 이터레이터(Iterator) 패턴의 정의, 사용 이유, 구현방법

     

    JAVA 디자인패턴 - 이터레이터(Iterator) 패턴의 정의, 사용 이유, 구현방법

    [ 목차 ] 안녕하세요, 프로그래밍 세계의 친구분들! 오늘은 자주 사용되는 자바 디자인 패턴 중 하나인 이터레이터(Iterator) 패턴에 대해 알아볼까요? 디자인 패턴이란 소프트웨어를 설계할 때 반

    tech.dj-tiger.com

    2023.07.17 - [JAVA] - JAVA 디자인패턴 - 상태(State) 패턴의 정의, 구성요소, 구현, 장단점

    2023.07.17 - [JAVA] - JAVA 디자인패턴 -프로토타입(Prototype) 패턴의 정의, 장점, 구현

     

    댓글

    💲 추천 글