JAVA 자바 디자인 패턴 : 프록시 패턴, 이터레이터 패턴, 장점 단점, 예시

2024. 4. 16. 22:05코딩/코딩 테스트

 

JAVA 자바 디자인 패턴 : 프록시 패턴

프록시 패턴(Proxy Pattern)은 객체의 대리인 또는 자리채움자로 작동하는 객체를 제공하여 원래 객체에 대한 접근을 제어하거나 기능을 추가하는 디자인 패턴입니다. 이 패턴은 클라이언트와 실제 객체 사이에 중재자 역할을 하는 프록시 객체를 두어, 직접적인 객체 접근을 피하고 여러 가지 유용한 용도로 활용됩니다. 주로 사용되는 용도로는 지연 초기화, 접근 제어, 로깅, 캐싱 등이 있습니다.

 

 

 

 

 

프록시 패턴의 종류

프록시 패턴은 크게 세 가지 유형으로 나뉩니다:

  1. 가상 프록시(Virtual Proxy): 객체의 생성을 지연시키는 데 사용됩니다.
  2. 보호 프록시(Protection Proxy): 객체에 대한 접근을 제어하는 데 사용됩니다.
  3. 리모트 프록시(Remote Proxy): 네트워크 연결을 통해 객체에 접근하는 것을 관리합니다.

 

 

자바에서의 프록시 패턴 예시

다음은 자바로 구현한 간단한 가상 프록시 패턴의 예입니다. 여기서는 이미지를 로딩하는 비용이 큰 객체에 대한 프록시를 구현하여, 실제로 이미지가 필요할 때까지 로딩을 지연시킵니다.

 

interface Image {
    void display();
}

// 실제 이미지를 로딩하고 표시하는 클래스
class RealImage implements Image {
    private String fileName;

    public RealImage(String fileName) {
        this.fileName = fileName;
        loadFromDisk(fileName);
    }

    private void loadFromDisk(String fileName) {
        System.out.println("Loading " + fileName);
    }

    @Override
    public void display() {
        System.out.println("Displaying " + fileName);
    }
}

// RealImage 객체의 생성을 지연시키는 프록시 클래스
class ProxyImage implements Image {
    private RealImage realImage;
    private String fileName;

    public ProxyImage(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(fileName);
        }
        realImage.display();
    }
}

public class ProxyDemo {
    public static void main(String[] args) {
        Image image = new ProxyImage("test_10mb.jpg");
        
        // 이미지가 실제로 필요할 때만 로딩됩니다.
        image.display();
    }
}

 

 

프록시 패턴의 장점

  1. 원본 객체 보호: 프록시를 통해 원본 객체를 직접적인 변경으로부터 보호할 수 있습니다.
  2. 리소스 관리: 비용이 큰 작업, 예를 들어 네트워크 요청이나 메모리 집약적인 작업의 결과를 캐싱할 수 있습니다.
  3. 접근 제어: 객체에 대한 접근을 제어하거나 검증 로직을 추가할 수 있습니다.
  4. 투명성 제공: 클라이언트 코드를 변경하지 않고도 특정 기능을 추가하거나 수정할 수 있습니다.

 

프록시 패턴의 단점

  1. 응답 시간 증가: 프록시가 추가적인 처리 작업을 수행하기 때문에, 응답 시간이 늘어날 수 있습니다.
  2. 복잡성 증가: 프록시 클래스를 추가함으로써 시스템의 구조가 복잡해질 수 있습니다.
  3. 디버깅 어려움: 프록시가 중간에 개입함으로써 디버깅이 더 어려워질 수 있습니다.

 

 

 

 

 

 


JAVA 자바 디자인 패턴 : 이터레이터 패턴

 

이터레이터 패턴(Iterator Pattern)은 컬렉션의 구현 방법을 노출시키지 않으면서 그 요소들을 순차적으로 접근할 수 있는 방법을 제공하는 디자인 패턴입니다. 이 패턴은 컬렉션의 내부 표현방식에 상관없이 그 요소들을 순회할 수 있는 인터페이스를 정의합니다. 이터레이터 패턴은 특히 컬렉션이 복잡하거나 다양한 순회 방식을 지원해야 할 때 유용합니다.

 

 

 

 

자바에서의 이터레이터 패턴 예시

자바의 Iterable 인터페이스와 Iterator 인터페이스를 활용한 기본적인 예를 살펴보겠습니다. 이 예에서는 간단한 책 목록을 순회하는 이터레이터를 구현합니다.

 

 

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

// 컬렉션 인터페이스
class BookCollection implements Iterable<String> {
    private List<String> books;

    public BookCollection() {
        this.books = new ArrayList<>();
    }

    public void addBook(String book) {
        books.add(book);
    }

    @Override
    public Iterator<String> iterator() {
        return new BookIterator();
    }

    // 이터레이터 구현 클래스
    private class BookIterator implements Iterator<String> {
        private int currentIndex = 0;

        @Override
        public boolean hasNext() {
            return currentIndex < books.size();
        }

        @Override
        public String next() {
            return books.get(currentIndex++);
        }
    }
}

public class IteratorExample {
    public static void main(String[] args) {
        BookCollection collection = new BookCollection();
        collection.addBook("Java Basics");
        collection.addBook("Design Patterns");
        collection.addBook("Effective Java");

        for (String book : collection) {
            System.out.println(book);
        }
    }
}

 

 

 

이터레이터 패턴의 장점

  1. 추상화: 컬렉션의 구현과 상관 없이 일관된 방법으로 요소들을 순회할 수 있습니다.
  2. 단일 책임 원칙: 컬렉션의 관리와 순회 기능이 분리되어 각각이 자신의 책임을 명확히 수행합니다.
  3. 다양한 순회: 같은 컬렉션에 대해 다른 순회 방식을 제공할 수 있는 여러 이터레이터를 구현할 수 있습니다.

 

이터레이터 패턴의 단점

  1. 클래스의 수 증가: 각 컬렉션 또는 순회 방식마다 별도의 이터레이터 클래스를 구현해야 하므로 클래스 수가 증가합니다.
  2. 복잡성 증가: 단순 순회 이상의 복잡한 연산을 수행하려 할 때, 이터레이터의 구현이 복잡해질 수 있습니다.

 

 

 

 

 

 

 

JAVA 자바 디자인 패턴 : 프록시 패턴, 이터레이터 패턴, 장점 단점, 예시