item 1 sungjaeyoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

μƒμ„±μž λŒ€μ‹  정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό κ³ λ €ν•˜λΌ.

클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ–»λŠ” 전톡적인 방법은 public μƒμ„±μžλ‹€.
ν•˜μ§€λ§Œ ν΄λž˜μŠ€λŠ” μƒμ„±μžμ™€ λ³„λ„λ‘œ 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•  수 μžˆλ‹€.

μƒμ„±μžλ³΄λ‹€ 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό μ œκ³΅ν•˜λŠ” λ°©μ‹μ—λŠ” μž₯단점이 μžˆλ‹€.


μž₯점

1.이름을 κ°€μ§ˆ 수 μžˆλ‹€.

μƒμ„±μžμ—κ²Œ λ„˜κΈ°λŠ” λ§€κ°œλ³€μˆ˜μ™€ μƒμ„±μžλ‘œλŠ” 객체의 νŠΉμ„±μ„ μ œλŒ€λ‘œ μ„€λͺ…ν•˜μ§€ λͺ»ν•œλ‹€.

BigInteger(int,int,Random) // μƒμ„±μž
BigInteger.probablePrime(int bitLength, Random rnd) //정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œ

λ‹€μŒ 두 μ½”λ“œ μ€‘μ—μ„œ μ–΄λŠ μͺ½μ΄ "μ†Œμˆ˜μΈ BigInteger μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€"λŠ” 의미λ₯Ό 더 잘 μ„€λͺ…ν• κΉŒ?

λ˜ν•œ λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œλ₯Ό λ‹€λ₯΄κ²Œ ν•˜μ—¬ μƒμ„±μžλ₯Ό μΆ”κ°€ν•˜λŠ” 방식을 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ‘œ λ°”κΎΈκ³  차이점을 잘 λ“€μ–΄λ‚΄μ£ΌλŠ” 이름을 지어쀀닀면
κ°œλ°œμžκ°€ μ—‰λš±ν•œ 것을 ν˜ΈμΆœν•˜λŠ” μ‹€μˆ˜λ₯Ό 방지할 수 μžˆλ‹€.

2. 호좜 될 λ•Œλ§ˆλ‹€ μΈμŠ€ν„΄μŠ€λ₯Ό μƒˆλ‘œ μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

μΈμŠ€ν„΄μŠ€λ₯Ό 미리 λ§Œλ“€μ–΄ λ†“κ±°λ‚˜ μƒˆλ‘œ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μž¬ν™œμš©ν•˜λŠ” μ‹μœΌλ‘œ λΆˆν•„μš”ν•œ 객체 생성을 ν”Όν•œλ‹€.
λŒ€ν‘œμ μΈ 예둜 μ•„λž˜ μ½”λ“œλŠ” 객체λ₯Ό μ•„μ˜ˆ μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€.

Boolean.valueOf(boolean)

λ”°λΌμ„œ μƒμ„±λΉ„μš©μ΄ λ†’κ³  자주 ν˜ΈμΆœλ˜λŠ” 객체λ₯Ό μ •μ νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ‘œ κ΅¬ν˜„ν•œλ‹€λ©΄ μ„±λŠ₯을 μ˜¬λ €μ€€λ‹€.
ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄κ³Ό λΉ„μŠ·ν•œ 기법이닀.(ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄ - 객체의 λ‚΄λΆ€μ—μ„œ μ°Έμ‘°ν•˜λŠ” 객체λ₯Ό 직접 λ§Œλ“œλŠ” 것이 μ•„λ‹ˆλΌ μ—†λ‹€λ©΄ μƒμ„±ν•˜κ³ , λ§Œλ“€μ–΄μ Έ μžˆλ‹€λ©΄ κ³΅μœ ν•˜λŠ” μ‹μœΌλ‘œ 객체λ₯Ό κ΅¬μ„±ν•˜λŠ” νŒ¨ν„΄)

3. λ°˜ν™˜ νƒ€μž…μ˜ ν•˜μœ„ νƒ€μž…κ°μ²΄λ₯Ό λ°˜ν™˜ν•  수 μžˆλŠ” λŠ₯λ ₯이 μžˆλ‹€.

API λ₯Ό μž‘μ„±ν•  λ•Œ, κ΅¬ν˜„ν΄λž˜μŠ€λ₯Ό κ³΅κ°œν•˜μ§€ μ•Šκ³ λ„ κ·Έ 객체λ₯Ό λ°˜ν™˜ν•  수 μžˆμ–΄ API λ₯Ό μž‘κ²Œ μœ μ§€ν•  수 μžˆλ‹€.
즉 ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” λͺ…μ‹œν•œ μΈν„°νŽ˜μ΄μŠ€λŒ€λ‘œ λ™μž‘ν•˜λŠ” 객체λ₯Ό 얻을 κ²ƒμž„μ„ μ•ŒκΈ°μ— ꡳ이 별도 λ¬Έμ„œλ₯Ό μ°Ύμ•„κ°€λ©° κ΅¬ν˜„ν΄λž˜μŠ€κ°€ 뭔지 μ•Œμ•„λ³΄μ§€ μ•Šμ•„λ„ λœλ‹€.

4. μž…λ ₯ λ§€κ°œλ³€μˆ˜μ— 따라 맀번 λ‹€λ₯Έ 클래슀의 객체λ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€.

λ°˜ν™˜ νƒ€μž…μ˜ ν•˜μœ„ νƒ€μž…μ΄κΈ°λ§Œ ν•˜λ©΄ μ–΄λ–€ 클래슀의 객체λ₯Ό λ°˜ν™˜ν•˜λ“  상관없닀. 예λ₯Ό λ“€μ–΄

  • EnumSet ν΄λž˜μŠ€λŠ” μ›μ†Œκ°€ 64개 μ΄ν•˜λ©΄ ReqularEnumSet을 65개 이상이면 JumboEnumSet의 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€.

ν΄λΌμ΄μ–ΈνŠΈλŠ” νŒ©ν„°λ¦¬κ°€ κ±΄λ„€μ£ΌλŠ” 객체가 μ–΄λŠ 클래슀의 μΈμŠ€ν„΄μŠ€μΈμ§€ μ•Œ ν•„μš”κ°€ μ—†λ‹€.
λ°˜ν™˜ ν•˜λŠ” μΈμŠ€ν„΄μŠ€κ°€ EnumSet의 ν•˜μœ„ 클래슀이기만 ν•˜λ©΄ λ˜λŠ” 것이닀.

5. λ°˜ν™˜ν•˜λŠ” μ‹œμ μ—λŠ” 객체의 ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

λŒ€ν‘œμ μΈ μ„œλΉ„μŠ€ 제곡자 ν”„λ ˆμž„μ›Œν¬ JDBCκ°€ μžˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” μ›ν•˜λŠ” κ΅¬ν˜„μ²΄μ˜ 쑰건을 λͺ…μ‹œ(μ„œλΉ„μŠ€ μ ‘κ·Ό API)ν•  수 있고 μ΄λŸ¬ν•œ 쑰건듀이 μœ μ—°ν•œ μ •μ νŒ©ν† λ¦¬μ˜ 싀체이닀.


단점

1. 상속을 ν•˜λ €λ©΄ publicμ΄λ‚˜ protected μƒμ„±μžκ°€ ν•„μš”ν•˜λ‹ˆ 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ§Œ μ œκ³΅ν•˜λ©΄ ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“€μˆ˜ μ—†λ‹€.

μ•žμ„œ μ΄μ•ΌκΈ°ν•œ μΏ¨λž˜μŠ€λ“€μ€ 상속할 수 μ—†λ‹€λŠ” 이야기이닀. 이 단점은 상속보닀 μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λ„λ‘ μœ λ„ν•˜λ„λ‘ μž₯점으둜 받아듀일 μˆ˜λ„ μžˆλ‹€.

2. 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ°ΎκΈ° μ–΄λ ΅λ‹€.

정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλŠ” 일반 λ©”μ„œλ“œμ΄λ―€λ‘œ μƒμ„±μžμ²˜λŸΌ Java docs에 λͺ…ν™•νžˆ ν‘œν˜„λ˜μ§€ μ•ŠλŠ”λ‹€.
λ”°λΌμ„œ μƒμ„±μžκ°€ μ—†μœΌλ©΄ 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό μ°ΎλŠ” λ“±μ˜ 개발자의 λΆˆνŽΈν•¨μ΄ μƒκΈ°λ―€λ‘œ μ•Œλ €μ§„ κ·œμ•½μ— 따라 μ •μ νŒ©ν„°λ¦¬ λ©”μ†Œλ“œμ˜ 넀이밍을 ν•˜λŠ” μ‹μœΌλ‘œ 문제λ₯Ό μ™„ν™”ν•΄μ€˜μ•Ό ν•œλ‹€.

from: λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μ•„μ„œ ν•΄λ‹Ή νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜

Date date = Date.from(instant);

of: μ—¬λŸ¬ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›μ•„μ„œ μΈμŠ€ν„΄μŠ€ λ°˜ν™˜

Set<Rank> cards = EnumSet.of(JACK, QUEEN, KING);

valueOf: fromκ³Ό of의 더 μžμ„Έν•œ 버전

BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);

instance / getInstance: μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ, 같은 μΈμŠ€ν„΄μŠ€μž„μ„ 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

StackWalker luke = StackWalker.getInstance(options);

create / newInstance: 맀번 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό 생성해 λ°˜ν™˜ν•œλ‹€.

Object newArray = Array.newInstance(classObject, arrayLen);

getType: getInstance와 κ°™μœΌλ‚˜ 생성할 ν΄λž˜μŠ€κ°€ μ•„λ‹Œ λ‹€λ₯Έ ν΄λž˜μŠ€μ— νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©

FileStore fs = Files.getFileStore(path);

newType: newInstance와 κ°™μœΌλ‚˜ 생성할 ν΄λž˜μŠ€κ°€ μ•„λ‹Œ λ‹€λ₯Έ ν΄λž˜μŠ€μ— νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©

BufferedReader br = Files.newBufferedReader(path);

type: getTypeκ³Ό newType의 κ°„κ²°ν•œ 버전

List<Complaint> litany = Collections.list(someList);

예제

μ•Œκ³ λ¦¬μ¦˜ 문제 풀이쀑 ν‰μ†Œκ°™μ•˜λ‹€λ©΄ X, Y μ’Œν‘œλ₯Ό 슀트링으둜 λ°›μ•„ Point둜 λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό μƒμ„±μžλ‘œ μƒμ„±ν–ˆμ„ 텐데 정적 νŒ©ν„°λ¦¬ λ©”μ†Œλ“œλ‘œ κ΅¬ν˜„ν•΄λ³΄μ•˜λ‹€.

μž…λ ₯μ˜ˆμ‹œ) 1000 500

public Point(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
public static Point convertStringToPoint(String str) {
	String []arr = str.split(" ");
	return new Point(Integer.parseInt(arr[0]), Integer.parseInt(arr[1]));
}

Point 클래슀

Point p1 = Point.convertStringToPoint("1000 500");
Point p2 = Point.convertStringToPoint("300 500");

μ „μ²΄μ½”λ“œ


정리

정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œμ˜ μž₯단점을 μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.
μ •μ νŒ©ν„°λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ μœ λ¦¬ν•œ κ²½μš°κ°€ λ§ŽμœΌλ―€λ‘œ λ¬΄μž‘μ • public μƒμ„±μžλ₯Ό μ œκ³΅ν•˜λ˜ μŠ΅κ΄€μ΄ μžˆλ‹€λ©΄ 고치자.

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