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

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

public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPPIN = 1;
public static final int APPLE_GRANNY_SMITH = 2;

public static final int ORANGE_NAVEL = 0;
public static final int ORANGE_TEMPLE = 1;
public static final int ORANGE_BLOOD = 2;

μ •μˆ˜ μ—΄κ±° νŒ¨ν„΄ κΈ°λ²•μ—λŠ” 단점이 λ§Žλ‹€.

  • νƒ€μž… μ•ˆμ „μ„ 보μž₯ν•  방법이 μ—†μœΌλ©° ν‘œν˜„λ ₯도 쒋지 μ•Šλ‹€. μ˜€λ Œμ§€λ₯Ό 건넀야 ν•  λ©”μ„œλ“œμ— 사과λ₯Ό 보내고 동등 μ—°μ‚°μžλ‘œ λΉ„κ΅ν•˜λ”λΌλ„ μ»΄νŒŒμΌλŸ¬λŠ” μ•„λ¬΄λŸ° κ²½κ³  λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μƒμˆ˜μ˜ 값이 λ°”λ€Œλ©΄ ν΄λΌμ΄μ–ΈνŠΈλ„ λ°˜λ“œμ‹œ λ‹€μ‹œ μ»΄νŒŒμΌν•΄μ•Ό ν•œλ‹€. λ‹€μ‹œ μ»΄νŒŒμΌν•˜μ§€ μ•Šμ€ ν΄λΌμ΄μ–ΈνŠΈλŠ” 싀행이 λ˜λ”λΌλ„ μ—‰λš±ν•˜κ²Œ λ™μž‘ν•  것이닀.
  • μ •μˆ˜ μƒμˆ˜λŠ” λ¬Έμžμ—΄λ‘œ 좜λ ₯ν•˜κΈ°κ°€ λ‹€μ†Œ κΉŒλ‹€λ‘­λ‹€. 심지어 κ·Έ μ•ˆμ— μƒμˆ˜κ°€ λͺ‡ 개 인지도 μ•Œ 수 μ—†λ‹€.
  • μ •μˆ˜ λŒ€μ‹  λ¬Έμžμ—΄ μƒμˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λ³€ν˜•ν•˜λŠ” νŒ¨ν„΄λ„ μžˆμ§€λ§Œ, μƒμˆ˜μ˜ 의미λ₯Ό 좜λ ₯ν•  수 μžˆλ‹€λŠ” 점은 μ’‹μ§€λ§Œ λ¬Έμžμ—΄ μƒμˆ˜μ˜ 이름 λŒ€μ‹  λ¬Έμžμ—΄ 값을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ©΄ μ˜€νƒ€κ°€ μžˆμ–΄λ„ μ»΄νŒŒμΌλŸ¬λŠ” 확인할 길이 μ—†μœΌλ‹ˆ μžμ—°μŠ€λŸ½κ²Œ λŸ°νƒ€μž„ 버그가 생긴닀.

μ—΄κ±° νƒ€μž…μ„ μ“°λ©΄ μ–΄λ–€ 뢀뢄이 μž₯점이 μžˆμ„κΉŒ

  • μ—΄κ±° νƒ€μž… μžμ²΄λŠ” 클래슀이며, μƒμˆ˜ ν•˜λ‚˜λ‹Ή μžμ‹ μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜μ”© λ§Œλ“€μ–΄ public static final ν•„λ“œλ‘œ κ³΅κ°œν•œλ‹€. μ—΄κ±° νƒ€μž…μ€ λ°–μ—μ„œ μ ‘κ·Όν•  수 μžˆλŠ” μƒμ„±μžλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 사싀상 final이닀.

  • μ—΄κ±° νƒ€μž…μ€ 컴파일 νƒ€μž„ νƒ€μž… μ•ˆμ „μ„±μ„ μ œκ³΅ν•œλ‹€.

  • μ—΄κ±° νƒ€μž…μ—λŠ” 각자의 이름 곡간이 μžˆμ–΄μ„œ 이름이 같은 μƒμˆ˜λ„ ν‰ν™”λ‘­κ²Œ κ³΅μ‘΄ν•œλ‹€.

  • μ—΄κ±° νƒ€μž…μ— μƒˆλ‘œμš΄ μƒμˆ˜λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μˆœμ„œλ₯Ό 바꿔도 λ‹€μ‹œ μ»΄νŒŒμΌν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

  • μ—΄κ±° νƒ€μž…μ—λŠ” μž„μ˜μ˜ λ©”μ„œλ“œλ‚˜ ν•„λ“œλ₯Ό μΆ”κ°€ν•  수 있고 μž„μ˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ²Œ ν•  μˆ˜λ„ μžˆλ‹€.

  • μ—΄κ±° νƒ€μž…μ€ μžμ‹  μ•ˆμ— μ •μ˜λœ μƒμˆ˜ λ“€μ˜ 값을 배열에 λ‹΄μ•„ λ°˜ν™˜ν•˜λŠ” 정적 λ©”μ„œλ“œμΈ valuesλ₯Ό μ œκ³΅ν•œλ‹€.

    public class WeightTable {
    	public static void main(String[] args) {
    		double eartchWeight = Double.parseDouble(args[0]);
    		double mass = earchWeight / Planet.EARTH.surfaceGravity();
    		for (Planet p : Planet.values())
    			System.out.printf("%sμ—μ„œμ˜ λ¬΄κ²ŒλŠ” %f이닀.\n",p,p.surfaceWeight(mass));
    	}
    }
    
  • μ—΄κ±° νƒ€μž…μ€ μƒμˆ˜λ³„ λ©”μ„œλ“œ κ΅¬ν˜„λ„ κ°€λŠ₯ν•˜λ‹€.

    public enum Operation {
    	PLUS("+") {
    		public double apply(double x, double y) { return x + y; }
    	},
    	MINUS("-") {
    		public double apply(double x, double y) { return x - y; }
    	...
    }
    
    public static void main(String[] args) {
    	double x = Double.parseDouble(args[0]);
    	double y = Double.parseDouble(args[1]);
    	for (Operation op : Operation.values())
    		System.out.printf("%f %s %f = %f\n", x, op, y, op.apply(x,y));
    }
    
  • ν•˜μ§€λ§Œ κΈ°μ‘΄ μ—΄κ±° νƒ€μž…μ— μƒμˆ˜λ³„ λ™μž‘μ„ ν˜Όν•©ν•΄ 넣을 λ•ŒλŠ” switch 문이 쒋은 선택이 될 수 μžˆλ‹€.

    public static Operation inverse(Operation op) {
    	switch(op) {
    		case PLUS: return Operation.MINUS;
    		case MINUS: return Operation.PLUS;
    		case TIMES: return Operation.DIVIDE;
    		case DIVIDE: return Operation.TIMES;
    
    		default: throw new AssertionError("μ•Œ 수 μ—†λŠ” μ—°μ‚° : "+ op);
    	}
    }
    

μ—΄κ±° νƒ€μž…μ—μ„œ μƒμˆ˜λ₯Ό ν•˜λ‚˜ μ œκ±°ν•˜λ©΄ μ–΄λ–»κ²Œ λ˜μ§€?

μ œκ±°ν•œ μƒμˆ˜λ₯Ό μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” ν΄λΌμ΄μ–ΈνŠΈμ—λŠ” 아무 영ν–₯이 μ—†λ‹€. ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ‹€μ‹œ μ»΄νŒŒμΌν•˜μ§€ μ•ŠμœΌλ©΄ λŸ°νƒ€μž„μ— μ—­μ‹œ 같은 μ€„μ—μ„œ μœ μš©ν•œ μ˜ˆμ™Έκ°€ λ°œμƒν•  것이닀.

정리

μ—΄κ±° νƒ€μž…μ€ ν™•μ‹€νžˆ μ •μˆ˜ μƒμˆ˜λ³΄λ‹€ λ›°μ–΄λ‚˜λ‹€. 더 읽기 쉽고 μ•ˆμ „ν•˜κ³  κ°•λ ₯ν•˜λ‹€. λŒ€λ‹€μˆ˜ μ—΄κ±° νƒ€μž…μ΄ λͺ…μ‹œμ  μƒμ„±μžλ‚˜ λ©”μ„œλ“œ 없이 μ“°μ΄μ§€λ§Œ, 각 μƒμˆ˜λ₯Ό νŠΉμ • 데이터와 μ—°κ²°λ˜κ±°λ‚˜ μƒμˆ˜ λ§ˆλ‹€ λ‹€λ₯΄κ²Œ λ™μž‘ν•˜κ²Œ ν•  λ•ŒλŠ” ν•„μš”ν•˜λ‹€. λ“œλ¬Όκ²ŒλŠ” ν•˜λ‚˜μ˜ λ©”μ„œλ“œκ°€ μƒμˆ˜λ³„λ‘œ λ‹€λ₯΄κ²Œ λ™μž‘ν•΄μ•Ό ν•  λ•Œλ„ μžˆλ‹€. 이런 μ—΄κ±° νƒ€μž… μ—μ„œλŠ” switch λ¬Έ λŒ€μ‹  μƒμˆ˜λ³„ λ©”μ„œλ“œ κ΅¬ν˜„μ„ μ‚¬μš©ν•˜μž.