디자인 패턴 (3) - 이터레이터, 노출 모듈 패턴

2ㅣ2ㅣ·2024년 10월 11일

CS

목록 보기
6/13
post-thumbnail

6. 이터레이터 패턴

이터레이터

  • 구현 방식과 상관없이(자료형과 상관없이) 조회에만 집중하는 인터페이스

이터레이터 패턴

  • Collection 요소들에 접근하는 디자인패턴
  • 대부분의 프로그래밍 언어에서 지원함
  • Collection 요소들을 Iterator로 순회가능한 이유는 Collection 요소가 Iterable을 상속받기 때문임

ArrayList를 예로 들어봤음

  • List가 상속받는 인터페이스를 타고타고 들어가보면
    public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    public interface List<E> extends SequencedCollection<E>
    public interface SequencedCollection<E> extends Collection<E>
  • 최종적으로 Iterable을 상속받는다는 것을 알 수 있음
    public interface Collection<E> extends Iterable<E>

이터레이터 패턴 예시

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

public class Iterator {
	public static void main(String[] args) {
		List<String> names = new ArrayList<>();
		names.add("sue");
		names.add("hak");
		
		Iterator<String> iterator = names.iterator();
		while(iterator.hasNext()) {
			System.out.println(iterator.next());
		}
	}
}
  • 이터레이터를 사용하려면 iterator 타입의 변수를 매번 생성, 초기화 과정을 거쳐야
    • Iterator는 순회하는데 필요한 포인터 역할을 할 뿐이라 가벼운 구조로 설계되어있음
    • 때문에 메모리 사용량은 크지 않지만 사용하기까지 과정이 매우 구찮음
  • 이러한 단점을 극복하기 위해 For-each을 활용할 수 있음.

For-Each 예시

  • 간단하게 순회가 가능함
for(String name : names) {
		System.out.println(name);
}
  • 단, For-each문은 순회하는 동안 읽기 작업만 가능하다는 한계가 있음
for(String name : names) {
		if(name.equals("hak")) {
				name.remove(); // 불가능 - remove 자체를 사용 불가
		}
		System.out.println(name);
}
  • 이터레이터 패턴은 순회하면서 수정이 가능함
Iterator<String> iterator = names.iterator();
		while(iterator.hasNext()) {
				String name = iterator.next();
				if(name.equals("hak")) { 
					iterator.remove(); // 순회하는 동안 수정 가능
				}else {
					System.out.println(name);
		}
}

7. 노출모듈 패턴

  • 즉시 실행 함수를 통해 private, public 같은 접근제어자를 만드는 패턴
  • 즉시 실행 함수
    • 정의되자마자 즉시 실행되는 함수, 실행 후에는 사용 불가
    • 재사용하지 않을 코드에 한해서 전역 변수의 수를 제한하고자 사용
  • 접근제어자가 없는 자바스크립트 같은 언어에서 코드의 캡슐화를 위해 구현
  • 대표적인 노출모듈 패턴의 예시로 CJS(CommonJS)모듈 방식이 있음
const pukuba = (()=>{
  const a = 1
  const b = () => 2
  const public = {
    c : 2,
    d : () => 3
  }
  return public;
})()

console.log(pukuba) // { c: 2, d: ƒ d() }
console.log(pukuba.a) // undefined
  • 코드 해석 자바스크립트의 스코프와 반환형식에 따라,
    • public 객체 내부에 포함되는 c,d는 pukuba 변수에 담겨서 외부에서 접근 가능(public)
    • 함수 스코프 내부에만 포함되는 a,b는 내부에서만 접근가능한 지역변수(private)

💡 싱글톤과 노출 모듈 패턴의 차이
두 패턴 모두 객체의 인스턴스를 제한하고, 특정 접근 방식으로만 객체에 접근하게 하여 전역 상태를 통제함
두 방식은 목적과 구현 방식에서 차이가 있음
노출 모듈 패턴은 즉시 실행 함수로 내부 데이터를 캡슐화하는 방식에 집중하여 접근 범위를 제어
싱글턴 패턴은 오직 하나의 인스턴스만 생성되도록 제한하는 것에 집중하여 인스턴스를 공유하는 방식으로 상태를 관리함

profile
https://sususoo.tistory.com/

0개의 댓글