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

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

μ΄λ”°κΈˆ λ‹¨μˆœνžˆ 정적 λ©”μ„œλ“œμ™€ 정적 ν•„λ“œλ§Œμ„ 담은 클래슀λ₯Ό λ§Œλ“€κ³  싢을 λ•Œκ°€ μžˆμ„ 것이닀. 객체 지ν–₯적으둜 μ‚¬κ³ ν•˜μ§€ μ•ŠλŠ” 이듀이 μ’…μ’… λ‚¨μš©ν•˜λŠ” 방식이기에 그리 곱게 λ³΄μ΄μ§€λŠ” μ•Šμ§€λ§Œ λΆ„λͺ… λ‚˜λ¦„μ˜ μ“°μž„μƒˆκ°€ μžˆλ‹€. μ˜ˆμ»¨λŒ€ java.lang.Math와 java.util.Arrays처럼 κΈ°λ³Έ νƒ€μž… κ°’μ΄λ‚˜ λ°°μ—΄ κ΄€λ ¨ λ©”μ„œλ“œλ“€μ„ λͺ¨μ•„놓을 수 μžˆλ‹€. λ˜ν•œ java.util.Collections처럼 νŠΉμ • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 객체λ₯Ό μƒμ„±ν•΄μ£ΌλŠ” 정적 λ©”μ„œλ“œ(ν˜Ήμ€ νŒ©ν„°λ¦¬)λ₯Ό λͺ¨μ•„놓을 μˆ˜λ„ μžˆλ‹€.

정적 λ©€λ²„λ§Œ 담은 μœ ν‹Έλ¦¬ν‹° ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ‘œ λ§Œλ“€μ–΄ μ“°λ €κ³  μ„€κ³„ν•œκ²Œ μ•„λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μƒμ„±μžλ₯Ό λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄μ€€λ‹€. μ‹€μ œλ‘œ 곡개된 APIλ“€μ—μ„œλ„ 이처럼 μ˜λ„μΉ˜ μ•Šκ²Œ μΈμŠ€ν„΄μŠ€ν™”ν•  수 있게 된 ν΄λž˜μŠ€κ°€ μ’…μ’… λͺ©κ²©λ˜κ³€ ν•œλ‹€.

Q1. μ–΄λ–€ ν΄λž˜μŠ€λ“€μ΄ μžˆμ„κΉŒ?

좔상 클래슀둜 λ§Œλ“œλŠ” κ²ƒμœΌλ‘œλŠ” μΈμŠ€ν„΄μŠ€ν™”λ₯Ό 막을 수 μ—†λ‹€.

μ»¬νŒŒμΌλŸ¬κ°€ κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“œλŠ” κ²½μš°λŠ” 였직 λͺ…μ‹œλœ μƒμ„±μžκ°€ 없을 λ•ŒλΏμ΄λ‹ˆ private μƒμ„±μžλ₯Ό μΆ”κ°€ν•˜λ©΄ 클래슀의 μΈμŠ€ν„΄μŠ€ν™”λ₯Ό 막을 수 μžˆλ‹€.

public class UtilityClass {
	// κΈ°λ³Έ μƒμ„±μžκ°€ λ§Œλ“€μ–΄μ§€λŠ” 것을 λ§‰λŠ”λ‹€(μΈμŠ€ν„΄μŠ€ν™” λ°©μ§€μš©)
	private UtilityClass() {
		throw new AssertionError();
	}
	... 
}

λͺ…μ‹œμ  μƒμ„±μžκ°€ privateμ΄λ‹ˆ 클래슀 λ°”κΉ₯μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†λ‹€.

이 방식은 상속을 λΆˆκ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” νš¨κ³Όλ„ μžˆλ‹€. λͺ¨λ“  μƒμ„±μžλŠ” λͺ…μ‹œμ μ΄λ“  λ¬΅μ‹œμ μ΄λ“  μƒμœ„ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ²Œ λ˜λŠ”λ°, 이λ₯Ό private으둜 μ„ μ–Έν–ˆμœΌλ‹ˆ ν•˜μœ„ ν΄λž˜μŠ€κ°€ μƒμœ„ 클래슀의 μƒμ„±μžμ— μ ‘κ·Όν•  길이 λ§‰ν˜€λ²„λ¦°λ‹€.