item 47 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

Effective Java 3e μ•„μ΄ν…œ 47λ₯Ό μš”μ•½ν•œ λ‚΄μš© μž…λ‹ˆλ‹€.

μ›μ†Œ μ‹œν€€μŠ€, 즉 일련의 μ›μ†Œλ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œλŠ” μˆ˜μ—†μ΄ λ§Žλ‹€.

  • Collection
  • Set
  • List
  • Iterable
  • Array

for-each λ¬Έμ—μ„œλ§Œ μ“°μ΄κ±°λ‚˜ λ°˜ν™˜λœ μ›μ†Œ μ‹œν€€μŠ€κ°€ (주둜 contains(Object) 같은) 일뢀 Collection λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  수 없을 λ•ŒλŠ” Iterable μΈν„°νŽ˜μ΄μŠ€λ₯Ό 썼닀. λ°˜ν™˜ μ›μ†Œλ“€μ΄ κΈ°λ³Έ νƒ€μž…μ΄κ±°λ‚˜ μ„±λŠ₯에 λ―Όκ°ν•œ 상황이라면 배열을 썼닀.

Iterable, Array μ‚¬μš© μ˜ˆμ œκ°€ ν•„μš”ν•˜λ‹€

μŠ€νŠΈλ¦Όμ€ 반볡(Iteration)을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ 슀트림과 λ°˜λ³΅μ„ μ•Œλ§žκ²Œ μ‘°ν•©ν•΄μ•Ό 쒋은 μ½”λ“œκ°€ λ‚˜μ˜¨λ‹€.

사싀 Stream μΈν„°νŽ˜μ΄μŠ€λŠ” Iterable μΈν„°νŽ˜μ΄μŠ€κ°€ μ •μ˜ν•œ 좔상 λ©”μ„œλ“œλ₯Ό μ „λΆ€ 포함할 뿐만 μ•„λ‹ˆλΌ, Iterable μΈν„°νŽ˜μ΄μŠ€κ°€ μ •μ˜ν•œ λ°©μ‹λŒ€λ‘œ λ™μž‘ν•œλ‹€. κ·ΈλŸΌμ—λ„ for-each둜 μŠ€νŠΈλ¦Όμ„ λ°˜λ³΅ν•  수 μ—†λŠ” κΉŒλ‹­μ€ λ°”λ‘œ Stream이 Iterable을 ν™•μž₯(extend)ν•˜μ§€ μ•Šμ•„μ„œλ‹€.

public interface Stream<T> extends BaseStream<T, Stream<T>> {

    /**
     * Returns a stream consisting of the elements of this stream that match
     * the given predicate.
     *

객체 μ‹œν€€μŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•˜λŠ”λ°, 이 λ©”μ„œλ“œκ°€ 였직 슀트림 νŒŒμ΄ν”„λΌμΈ μ—μ„œλ§Œ 쓰일 κ±Έ μ•ˆλ‹€λ©΄ 마음 놓고 μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜ν•˜κ²Œ ν•΄μ£Όμž.

Collection μΈν„°νŽ˜μ΄μŠ€λŠ” Iterable의 ν•˜μœ„ νƒ€μž…μ΄κ³  stream λ©”μ„œλ“œλ„ μ œκ³΅ν•˜λ‹ˆ 반볡과 μŠ€νŠΈλ¦Όμ„ λ™μ‹œμ— μ§€μ›ν•œλ‹€. λ”°λΌμ„œ μ›μ†Œ μ‹œν€€μŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” 곡개 API의 λ°˜ν™˜ νƒ€μž…μ—λŠ” Collectionμ΄λ‚˜ κ·Έ ν•˜μœ„ νƒ€μž…μ„ μ“°λŠ” 게 일반적으둜 μ΅œμ„ μ΄λ‹€. ν•˜μ§€λ§Œ 단지 μ»¬λ ‰μ…˜μ„ λ°˜ν™˜ν•œλ‹€λŠ” 이유둜 덩치 큰 μ‹œν€€μŠ€λ₯Ό λ©”λͺ¨λ¦¬μ— μ˜¬λ €μ„œλŠ” μ•ˆ λœλ‹€.

λ°˜ν™˜ν•  μ‹œν€€μŠ€κ°€ ν¬μ§€λ§Œ ν‘œν˜„μ„ κ°„κ²°ν•˜κ²Œ ν•  수 μžˆλ‹€λ©΄ μ „μš© μ»¬λ ‰μ…˜μ„ κ΅¬ν˜„ν•˜λŠ” λ°©μ•ˆμ„ κ²€ν† ν•΄λ³΄μž.

public class PowerSet {
	public static final <E> Collection<Set<E>> of(Set<E> s) {
		List<E> src = new ArrayList<>(s);
		if (src.size() > 30)
			throw new IllegalArgumentException(
				"집합에 μ›μ†Œκ°€ λ„ˆλ¬΄ λ§ŽμŠ΅λ‹ˆλ‹€.(μ΅œλŒ€ 30개)".: + s);
		
		return new AbstractList<Set<E>>() {
			@Override public int size() {
				// λ©±μ§‘ν•©μ˜ ν¬κΈ°λŠ” 2λ₯Ό μ›λž˜ μ§‘ν•©μ˜ μ›μ†Œ 수만큼 κ±°λ“­μ œκ³±κ³Ό κ°™λ‹€. 
				return 1 << src.size();
			}

			@Override public boolean contains(Object o) {
				return o instanceof Set && src.containsAll((Set)o);
			}

			@Override public Set<E> get(int index) {
				Set<E> result = new HashSet<>();
				for (int i = 0; index != 0; i++, index >>=1)
					if ((index & 1) == 1)
						result.add(src.get(i));
					return result;
			}
		};
	}
}

AbstractCollection을 ν™œμš©ν•΄μ„œ Collection κ΅¬ν˜„μ²΄λ₯Ό μž‘μ„±ν•  λ•ŒλŠ” Iterable용 λ©”μ„œλ“œ 외에 2개만 더 κ΅¬ν˜„ν•˜λ©΄ λœλ‹€. λ°”λ‘œ contains와 sizeλ‹€.

μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜ν•˜λŠ” 두 가지 κ΅¬ν˜„μ„ μ•Œμ•„λ΄€λŠ”λ° λͺ¨λ‘ μ“Έλ§Œμ€ ν•˜λ‹€. ν•˜μ§€λ§Œ λ°˜λ³΅μ„ μ‚¬μš©ν•˜λŠ” 게 더 μžμ—°μŠ€λŸ¬μš΄ μƒν™©μ—μ„œλ„ μ‚¬μš©μžλŠ” κ·Έλƒ₯ μŠ€νŠΈλ¦Όμ„ μ“°κ±°λ‚˜ Stream을 Iterable둜 λ³€ν™˜ν•΄μ£ΌλŠ” μ–΄λŒ‘ν„°λ₯Ό μ΄μš©ν•΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ μ–΄λŒ‘ν„°λŠ” ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό μ–΄μˆ˜μ„ ν•˜κ²Œ λ§Œλ“€κ³  2,3λ°°κ°€ 더 λŠλ¦¬λ‹€.

정리

μ›μ†Œ μ‹œν€€μŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  λ•ŒλŠ”, 이λ₯Ό 슀트림으둜 μ²˜λ¦¬ν•˜κΈ°λ₯Ό μ›ν•˜λŠ” μ‚¬μš©μžμ™€ 반볡으둜 μ²˜λ¦¬ν•˜κΈΈ μ›ν•˜λŠ” μ‚¬μš©μžκ°€ λͺ¨λ‘ μžˆμ„ 수 μžˆμŒμ„ λ– μ˜¬λ¦¬κ³ , μ–‘μͺ½μ„ λ‹€ λ§Œμ‘±μ‹œν‚€λ € λ…Έλ ₯ν•˜μž. μ»¬λ ‰μ…˜μ„ λ°˜ν™˜ν•  수 μžˆλ‹€λ©΄ κ·Έλ ‡κ²Œ ν•˜λΌ. λ°˜ν™˜ μ „λΆ€ν„° 이미 μ›μ†Œλ“€μ„ μ»¬λ ‰μ…˜μ— λ‹΄μ•„ κ΄€λ¦¬ν•˜κ³  μžˆκ±°λ‚˜ μ»¬λ ‰μ…˜μ„ ν•˜λ‚˜ 더 λ§Œλ“€μ–΄λ„ 될 μ •λ„λ‘œ μ›μ†Œ κ°œμˆ˜κ°€ 적닀면 ArrayList 같은 ν‘œμ€€ μ»¬λ ‰μ…˜μ— λ‹΄μ•„ λ°˜ν™˜ν•˜λΌ. 그렇지 μ•ŠμœΌλ©΄ μ „μš© μ»¬λ ‰μ…˜μ„ κ΅¬ν˜„ν• μ§€ κ³ λ―Όν•˜λΌ. μ»¬λ ‰μ…˜μ„ λ°˜ν™˜ν•˜λŠ” 게 λΆˆκ°€λŠ₯ν•˜λ©΄ 슀트림과 Iterable 쀑 더 μžμ—°μŠ€λŸ¬μš΄ 것을 λ°˜ν™˜ν•˜λΌ. λ§Œμ•½ λ‚˜μ€‘μ— Stream μΈν„°νŽ˜μ΄μŠ€κ°€ Iterable을 μ§€μ›ν•˜λ„λ‘ μžλ°”κ°€ μˆ˜μ •λœλ‹€λ©΄, κ·Έλ•ŒλŠ” μ•ˆμ‹¬ν•˜κ³  μŠ€νŠΈλ¦Όμ„ λ°˜ν™˜ν•˜λ©΄ 될 것이닀(슀트림 μ²˜λ¦¬μ™€ 반볡 λͺ¨λ‘μ— μ‚¬μš©ν•  수 μžˆμœΌλ‹ˆ)

⚠️ **GitHub.com Fallback** ⚠️