item 22 JihoonKim - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

[item22] μΈν„°νŽ˜μ΄μŠ€λŠ” νƒ€μž…μ„ μ •μ˜ν•˜λŠ” μš©λ„λ‘œλ§Œ μ‚¬μš©ν•˜λΌ

μΈν„°νŽ˜μ΄μŠ€

  • μžμ‹ μ„ κ΅¬ν˜„ν•œ 클래슀의 instanceλ₯Ό μ°Έμ‘°ν•  수 μžˆλŠ” νƒ€μž… μ—­ν• 
  • 'ν΄λž˜μŠ€κ°€ μ–΄λ–€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€λŠ” 것'은 'μžμ‹ μ˜ instance둜 뭘 ν•  수 μžˆλŠ”μ§€μ— λŒ€ν•΄ ν΄λž˜μŠ€κ°€ ν΄λΌμ΄μ–ΈνŠΈμ— μ–˜κΈ°ν•΄μ£ΌλŠ” 것'

μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€ μ•ˆν‹° νŒ¨ν„΄

μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€

  • λ©”μ„œλ“œ 없이, static final ν•„λ“œλ‘œλ§Œ 이루어진 μΈν„°νŽ˜μ΄μŠ€
  • μ •κ·œν™”λœ 이름(qualified name)을 ν”Όν•˜κ³ μž κ΅¬ν˜„ν•˜κ³€ 함
public interface PhysicalConstants {
	static final double AVOGADROS_NUMBER   = 6.022_140_857e23; // [1], [2]
	static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; 
	static final double ELECTRON_MASS      = 9.109_383_56e-31;
}

[1] : interface의 fieldλŠ” public static final이 default이닀. (JLS-9)
[2] : 숫자 μ‚¬μ΄μ˜ 밑쀄('_')은 μ•„λ¬΄λŸ° 영ν–₯을 주지 μ•Šκ³  가독성을 높인닀.

  • java 7에 μΆ”κ°€
  • 숫자 끝에 μ‚¬μš© λΆˆκ°€
  • guide λ¬Έμ„œ

단점

  • 클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•˜λŠ” μƒμˆ˜ : λ‚΄λΆ€ κ΅¬ν˜„μ— ν•΄λ‹Ήν•˜κΈ°μ— μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€λŠ” λ‚΄λΆ€ κ΅¬ν˜„μ„ 클래슀의 API둜 λ…ΈμΆœν•˜λŠ” ν–‰μœ„
  • λ°”μ΄λ„ˆλ¦¬ ν˜Έν™˜μ„±1을 μœ„ν•΄ μ•ˆ 쓰더라도 μƒμˆ˜λ₯Ό 계속 κ΅¬ν˜„ν•˜κ³  μžˆμ–΄μ•Ό ν•œλ‹€.
  • final이 μ•„λ‹Œ ν΄λž˜μŠ€κ°€ μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€λ©΄ λͺ¨λ“  ν•˜μœ„ 클래슀의 이름곡간이 κ·Έ μΈν„°νŽ˜μ΄μŠ€κ°€ μ •μ˜ν•œ μƒμˆ˜λ“€λ‘œ μ˜€μ—Όλ˜μ–΄ 버린닀.

μƒμˆ˜ μΈν„°νŽ˜μ΄μŠ€ 예


'μƒμˆ˜ 곡개' λͺ©μ μ˜ ν•΄κ²° 방법

  • νŠΉμ • ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€μ™€ κ°•ν•˜κ²Œ μ—°κ΄€λœ μƒμˆ˜λΌλ©΄ κ·Έ ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€ μžμ²΄μ— μΆ”κ°€
    • ex> Integer와 Double의 MIN_VALUE, MAX_VALUE
  • μ—΄κ±° νƒ€μž…(item34)
  • μΈμŠ€ν„΄μŠ€ν™”ν•  수 μ—†λŠ” μœ ν‹Έλ¦¬ν‹° 클래슀(item4)
import package effectivejava.chapter4.item22.constantutilityclass.PhysicalConstants.*; // [1]
// package effectivejava.chapter4.item22.constantutilityclass;

public class PhysicalConstants {
	private PyysicalConstants(){} // μΈμŠ€ν„΄μŠ€ν™” 방지
	
	public static final double AVOGADROS_NUMBER   = 6.022_140_857e23;
	public static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
	public static final double ELECTRON_MASS      = 9.109_383_56e-31;
}

[1] : 정적 μž„ν¬νŠΈ(static import)λ₯Ό ν†΅ν•œ 클래슀 이름 μƒλž΅ κ°€λŠ₯
(PhysicalConstants.AVOGADROS_NUMBER -> AVOGADROS_NUMBER)


μš”μ•½

μΈν„°νŽ˜μ΄μŠ€λŠ” νƒ€μž…μ„ μ •μ˜ν•˜λŠ” μš©λ„λ‘œλ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. μƒμˆ˜ 곡개용 μˆ˜λ‹¨μœΌλ‘œ μ‚¬μš©ν•˜μ§€ 말자.


footnotes

  1. λ°”μ΄λ„ˆλ¦¬ ν˜Έν™˜μ„±(binary compatibility)
  • 클래슀의 λ‚΄μš©μ„ 변경해도, μ‚¬μš©ν•˜λŠ” μͺ½μ—μ„œ recompile을 ν•  ν•„μš”κ°€ μ—†λŠ” 것이닀.
    • ex> public, protected λ©”μ„œλ“œμ˜ μ‚­μ œ λ˜λŠ” rename을 ν•˜λ©΄ λ°”μ΄λ„ˆλ¦¬ ν˜Έν™˜μ„±μ΄ 깨진닀.
  • λ°”μ΄λ„ˆλ¦¬ ν˜Έν™˜μ„±μ„ 깨지 μ•Šκ³  클래슀의 멀버(ν•„λ“œ, λ©”μ„œλ“œ)의 μ‚­μ œ ν˜Ήμ€ 이름 변경이 κ°€λŠ₯ν•œ μ΄μœ λŠ” μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•  수 μ—†λŠ” 것듀이기 λ•Œλ¬Έ
  • JLS-13
  • stackoverflow - λ°”μ΄λ„ˆλ¦¬ ν˜Έν™˜μ„±

질문

  • 'μ •κ·œν™”λœ 이름을 ν”Όν•œλ‹€'의 의미
    • λ™μΌν•œ μ΄λ¦„μ˜ λ©”μ„œλ“œκ°€ μ—¬λŸ¬ 개 μžˆμ„ λ•Œ, 단 ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§Œμ„ μ„ νƒν•˜κΈ° μœ„ν•΄ λ©”μ„œλ“œ μ•žμ— λΆ€κ°€μ μœΌλ‘œ class 이름을 μ λŠ”κ±°?
  • λ°”μ΄λ„ˆλ¦¬ ν˜Έν™˜μ„±μ—μ„œ recompile에 λŒ€ν•΄ μ–ΈκΈ‰ν•˜κ³  μžˆλŠ”λ°, .class νŒŒμΌμ„ 의미?
⚠️ **GitHub.com Fallback** ⚠️