Home [Effective Java] Item 6
Post
Cancel

[Effective Java] Item 6

Effective Java - Item 6

λ˜‘κ°™μ€ κΈ°λŠ₯의 객체λ₯Ό μ—¬λŸ¬ 번 μƒμ„±ν•˜λŠ” 것보닀 μž¬μ‚¬μš©ν•˜λŠ” 것이 μ„±λŠ₯ ν–₯상에 도움이 될 수 μžˆλ‹€. 특히 λΆˆλ³€ κ°μ²΄λŠ” μ–Έμ œλ“  μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

1
2
3
String s1 = new String(”homework!”); // ν•˜μ§€ 말아야 ν•  μ½”λ“œ

String s2 = "homework!";

ν•΄λ‹Ή μ½”λ“œμ˜ s1, s2λŠ” 결과적으둜 같은 κΈ°λŠ₯을 ν•œλ‹€.

s1의 경우 β€œhomework!” μžμ²΄κ°€ ν•΄λ‹Ή μƒμ„±μžλ‘œ λ§Œλ“€μ–΄ λ‚΄λ €λŠ” String μΈμŠ€ν„΄μŠ€μ™€ μ™„μ „νžˆ κ°™μ§€λ§Œ, new String() 으둜 감싸 싀행될 λ•Œλ§ˆλ‹€ String μΈμŠ€ν„΄μŠ€κ°€ μƒˆλ‘œ μƒμ„±λœλ‹€.

ν•΄λ‹Ή μ½”λ“œκ°€ 빈번히 ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œ μ•ˆμ— μ‘΄μž¬ν•œλ‹€λ©΄ μ“Έλ°μ—†λŠ” String μΈμŠ€ν„΄μŠ€κ°€ 수백만 κ°œμ”© λ§Œλ“€μ–΄μ§ˆ μˆ˜λ„ μžˆλ‹€.

반면 s2와 같은 κ²½μš°μ—λŠ” λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ„ μž¬μ‚¬μš©ν•˜λ―€λ‘œ 같은 JVM에 λ™μΌν•œ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ΄ μ‘΄μžν•œλ‹€λ©΄ μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λ„ λΆˆν•„μš”ν•œ 객체 생성을 ν”Όν•  수 μžˆλ‹€.

β†’ 항상 μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” Boolean(String) μƒμ„±μž λŒ€μ‹  기쑴에 μΊμ‹±ν•œ 객체λ₯Ό λ°˜ν™˜ν•΄μ£ΌλŠ”Boolean.valueOf(String) νŒ©ν„°λ¦¬ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©

λ˜ν•œ 데이터 베이슀 컀λ„₯μ…˜κ³Ό 같이 생성 λΉ„μš©μ΄ λΉ„μ‹Ό 객체가 λ°˜λ³΅ν•΄μ„œ ν•„μš”ν•œ κ²½μš°μ—λŠ” 캐싱을 톡해 μž¬μ‚¬μš© ν•΄μ•Ό ν•œλ‹€. λ‹€λ§Œ μžμ‹ μ΄ 생성해야 ν•˜λŠ” 객체가 λΉ„μ‹Ό 객체인지λ₯Ό 맀번 λͺ…ν™•ν•˜κ²Œ μ•Œ

μˆ˜λŠ” μ—†λ‹€.

예λ₯Ό λ“€μ–΄, μ•„λž˜μ™€ 같이 String.matches() λ©”μ†Œλ“œλŠ” μ •κ·œν‘œν˜„μ‹μœΌλ‘œ λ¬Έμžμ—΄ ν˜•νƒœλ₯Ό ν™•μΈν•˜λŠ” κ°€μž₯ μ‰¬μš΄ λ°©λ²•μ΄μ§€λ§Œ, μ„±λŠ₯이 μ€‘μš”ν•œ μƒν™©μ—μ„œ λ°˜λ³΅ν•΄ μ‚¬μš©ν•˜κΈ°μ—λŠ” μ ν•©ν•˜μ§€ μ•Šλ‹€.

1
2
3
4
static boolean isRomanNumeral(String s) {
	return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
				+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}

β†’ matches() λ©”μ†Œλ“œ λ‚΄λΆ€μ—μ„œ μ •μ˜ν•˜λŠ” Pattern μΈμŠ€ν„΄μŠ€λŠ” 맀번 μƒˆλ‘œ μƒμ„±λ˜μ–΄ ν•œ 번 μ“°κ³  버렀져 κ³§λ°”λ‘œ 가비지 μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λœλ‹€.

String 클래슀의 matches() λ©”μ†Œλ“œκ°€ λ°˜ν™˜ν•˜λŠ” Pattern은 λΆˆλ³€ 클래슀(final class) 이고, 생성 λΉ„μš©μ΄ λΉ„μ‹ΈκΈ° λ•Œλ¬Έμ— μž¬μ‚¬μš©ν•˜κΈ°λ₯Ό ꢌμž₯ν•œλ‹€. Pattern 은 μž…λ ₯받은 μ •κ·œ ν‘œν˜„μ‹μ— ν•΄λ‹Ήν•˜λŠ” μœ ν•œ μƒνƒœ λ¨Έμ‹ (finite state machine)을 λ§Œλ“€κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ 생성 λΉ„μš©μ΄ λ†’λ‹€.

1
2
3
4
5
6
7
8
9
public class RomanNumerals {
	private static final Pattern ROMAN = Pattern.compile(
				"^(?=.)M*(C[MD]|D?C{0,3})"
				+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");

	static boolean isRomanNumeral(String s) {
		return ROMAN.matcher(s).matches();
	}
}

β†’ Pattern μΈμŠ€ν„΄μŠ€λ₯Ό static final ν•„λ“œλ‘œ κΊΌλ‚΄κ³  이름을 μ§€μ •ν•˜μ—¬ μ–΄λ–€ μ½”λ“œμΈμ§€ λͺ…ν™•ν•˜κ²Œ μ•Œ 수 μžˆλ‹€.

μ„±λŠ₯을 κ°œμ„ ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•„μš”ν•œ μ •κ·œν‘œν˜„μ‹μ„ ν‘œν˜„ν•˜λŠ” Pattern μΈμŠ€ν„΄μŠ€λ₯Ό 클래슀 μ΄ˆκΈ°ν™” κ³Όμ •μ—μ„œ 직접 μƒμ„±ν•˜μ—¬ μΊμ‹±ν•˜κ³ , λ‚˜μ€‘μ— λ©”μ„œλ“œκ°€ 호좜될 λ•Œλ§ˆλ‹€ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό μž¬μ‚¬μš©ν•˜λ„λ‘ ν•΄μ•Όν•œλ‹€.

λ‹€λ§Œ, κ°œμ„ λœ isRomanNumeral λ°©μ‹μ˜ ν΄λž˜μŠ€κ°€ μ΄ˆκΈ°ν™”λœ ν›„ λ©”μ„œλ“œλ₯Ό ν•œ λ²ˆλ„ ν˜ΈμΆœν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ROMAN ν•„λ“œλŠ” 쓸데없이 μ΄ˆκΈ°ν™”λœ 꼴이닀. λ©”μ„œλ“œκ°€ 처음 호좜될 λ•Œ ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 지연 μ΄ˆκΈ°ν™”(lazy initialzation)둜 λΆˆν•„μš”ν•œ μ΄ˆκΈ°ν™”λ₯Ό 막을 μˆ˜λŠ” μžˆμ§€λ§Œ, μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€λŠ” 것에 λΉ„ν•΄ μ„±λŠ₯은 크게 κ°œμ„ λ˜μ§€ μ•Šμ„ λ•Œκ°€ λ§Žλ‹€.

또 λ‹€λ₯Έ λΆˆν•„μš”ν•œ 객체λ₯Ό λ§Œλ“€μ–΄λ‚΄λŠ” μ˜ˆμ‹œλ‘œ μ˜€ν† λ°•μ‹±(auto boxing)을 λ“€ 수 μžˆλ‹€.

β“μ˜€ν† λ°•μ‹±(auto boxing)

μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ primitive data type을 그에 μƒμ‘ν•˜λŠ” wrapper class둜 μžλ™ λ³€ν™˜ μ‹œμΌœμ£ΌλŠ” 것, 예λ₯Ό λ“€λ©΄ intλ₯Ό Integer둜, double을 Double둜 λ³€ν™˜ν•œλ‹€.

1
2
3
4
5
6
7
private static long sum() {
	Long sum = 0L;
	for (long i = 0; i <= Integer.MAX_VALUE; i++) 
		sum += i;

	return sum;
}

β†’ λͺ¨λ“  μ–‘μ˜ μ •μˆ˜μ˜ 총합을 κ΅¬ν•˜λŠ” λ©”μ†Œλ“œ

μœ„ μ½”λ“œμ—μ„œ sum을 Long으둜 선언함에 따라 λΆˆν•„μš”ν•œ Long μΈμŠ€ν„΄μŠ€κ°€ κ³„μ†ν•΄μ„œ μƒμ„±λœλ‹€.

λ‹¨μˆœνžˆ sum의 νƒ€μž…μ„ long으둜만 λ°”κΏ”μ€˜λ„ μ˜€ν† λ°•μ‹±μ΄ μΌμ–΄λ‚˜μ§€ μ•Šκ³ , λΆˆν•„μš”ν•œ μΈμŠ€ν„΄μŠ€ 생성이 쀄어 μ„±λŠ₯이 쒋아진닀.

μ˜λ―ΈμƒμœΌλ‘œλŠ” 별닀λ₯Ό 것이 μ—†μ§€λ§Œ μ„±λŠ₯에 μžˆμ–΄μ„œλŠ” λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λ°•μ‹±λœ κΈ°λ³Έ νƒ€μž…λ³΄λ‹€λŠ” κΈ°λ³Έ νƒ€μž…μ„ μ‚¬μš©ν•˜κ³  μ˜λ„μΉ˜ μ•Šμ€ μ˜€ν† λ°•μ‹±μ΄ μˆ¨μ–΄λ“€μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•΄μ•Όν•œλ‹€.

This post is licensed under CC BY 4.0 by the author.

[Effective Java] Item 5

[Effective Java] Item 7