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

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

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” ν•„λ“œ 듀은 λͺ¨λ‘ private으둜 λ°”κΎΈκ³  public μ ‘κ·Όμž(getter)λ₯Ό μΆ”κ°€ν•œλ‹€.

    class Point {
    	private double x;
    	private double y;
    
    	public Point(double x, double y) {
    		this.x = x;
    		this.y = y;
    	}
    
    	public double getX() { return x; }
    	public double getY() { return y; }
    
    	public void setX(double x) { this.x = x; }
    	public void setY(double y) { this.y = y; }
    }

public 클래슀라면 이 방식이 λ§žλ‹€. νŒ¨ν‚€μ§€ λ°”κΉ₯μ—μ„œ μ ‘κ·Όν•  수 μžˆλŠ” 클래슀라면 μ ‘κ·Όμžλ₯Ό μ œκ³΅ν•¨μœΌλ‘œμ¨ 클래슀 λ‚΄λΆ€ ν‘œν˜„ 방식을 μ–Έμ œλ“  λ°”κΏ€ 수 μžˆλŠ” μœ μ—°μ„±μ„ 얻을 수 μžˆλ‹€.

Q. μΊ‘μŠν™”μ— λŒ€ν•΄μ„œ μ–΄λ–»κ²Œ μƒκ°ν•˜λ‚˜? A. λ””λ―Έν„°μ˜ 법칙, 묻지말고 μ‹œμΌœλΌ

ν•˜μ§€λ§Œ package-private 클래슀 ν˜Ήμ€ private 쀑첩 클래슀라면 데이터 ν•„λ“œλ₯Ό λ…ΈμΆœν•œλ‹€ 해도 ν•˜λ“±μ˜ λ¬Έμ œκ°€ μ—†λ‹€. private 쀑첩 클래슀의 경우라면 μˆ˜μ • λ²”μœ„κ°€ 더 μ’μ•„μ Έμ„œ 이 클래슀λ₯Ό ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ ν΄λž˜μŠ€κΉŒμ§€λ‘œ μ œν•œλœλ‹€.

μžλ°” ν”Œλž«νΌ λΌμ΄λΈŒλŸ¬λ¦¬μ—λ„ public 클래슀의 ν•„λ“œλ₯Ό 직접 λ…ΈμΆœν•˜μ§€ λ§λΌλŠ” κ·œμΉ™μ„ μ–΄κΈ°λŠ” 사둀가 μ’…μ’… μžˆλ‹€. λŒ€ν‘œμ μΈ μ˜ˆκ°€ java.awt.package νŒ¨ν‚€μ§€μ˜ Point와 Dimension ν΄λž˜μŠ€λ‹€.

public 클래슀의 ν•„λ“œκ°€ λΆˆλ³€μ΄λΌλ©΄ 직접 λ…ΈμΆœν•  λ•Œμ˜ 단점이 μ‘°κΈˆμ€ μ€„μ–΄λ“€μ§€λ§Œ, μ—¬μ „νžˆ κ²°μ½” 쒋은 생각이 μ•„λ‹ˆλ‹€. 단, λΆˆλ³€μ‹μ€ 보μž₯ν•  수 있게 λœλ‹€.

    public final class Time {
    	private static final int HOURS_PER_DAY = 24;
    	private static final int MINUTES_PER_HOUR = 60;
    
    	public final int hour;
    	public final int minute;
    
    	public Time(int hour, int minute) {
    		if (hour < 0 || hour >= HOURS_PER_DAY)
    			throw new IllegalArgumentException("μ‹œκ°„ : " + hour);
    		if (minute < 0 || minute >= MINUTES_PER_HOUR)
    			throw new IllegalArgumentException("λΆ„ : " + minute);
    		this.hour = hour;
    		this.minute = minute;
    	}
    	...
    }

정리

public ν΄λž˜μŠ€λŠ” μ ˆλŒ€ κ°€λ³€ ν•„λ“œλ₯Ό 직접 λ…ΈμΆœν•΄μ„œλŠ” μ•ˆ λœλ‹€. λΆˆλ³€ ν•„λ“œλΌλ©΄ λ…ΈμΆœν•΄λ„ 덜 μœ„ν—˜ν•˜μ§€λ§Œ μ™„μ „νžˆ μ•ˆμ‹¬ν•  μˆ˜λŠ” μ—†λ‹€. ν•˜μ§€λ§Œ package-private ν΄λž˜μŠ€λ‚˜ private 쀑첩 ν΄λž˜μŠ€μ—μ„œλŠ” μ’…μ’… (λΆˆλ³€μ΄λ“  가변이든) ν•„λ“œλ₯Ό λ…ΈμΆœν•˜λŠ” 편이 λ‚˜μ„ λ•Œλ„ μžˆλ‹€.