Item 50. Defensive Copy

์ ์‹œ์— ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๋ผ

์ž๋ฐ”๋Š” ๋ณดํ†ต ๋ฉ”๋ชจ๋ฆฌ ์ถฉ๋™ ์˜ค๋ฅ˜์—์„œ ์•ˆ์ „ํ•˜์ง€๋งŒ, ๋ถˆ๋ณ€์‹์„ ๊นจ๋œจ๋ฆฌ๋ ค๋Š” ๊ณต๊ฒฉ์—๋Š” ์œ„ํ˜‘์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ๋กœ ๋ถˆ๋ณ€์‹์„ ๊นจ๋œจ๋ฆฌ๋Š” ์‹œ์Šคํ…Œ ๋ณด์•ˆ ๊ณต๊ฒฉ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ผ€์ด์Šค์— ๋Œ€๋น„๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

public final class Period {
    private final Date start;
    private final Date end;

    public Period(Date start, Date end) {
        if (start.compareTo(end) > 0) {
            throw new IllegalArgumentException(start + " after " + end);
        }
        this.start = start;
        this.end = end;
    }

    public Date start() {
        return start;
    }

    public Date end() {
        return end;
    }
}

public class Attack {
    public static void main(String[] args) {
        Date start = new Date();
        Date end = new Date();
        Period p = new Period(start, end);
        end.setYear(78); // p์˜ ๋‚ด๋ถ€ ์ˆ˜์ •
    }
}

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ๋„ final์ด ์„ค์ •๋˜์–ด ์žˆ๊ณ , setter๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€์‹์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์—†์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๊ฐ€๋ณ€ ํ•„๋“œ์ธ Date๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€์‹์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„ , ๋‘ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ถˆ๋ณ€์‹์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  • ์ƒ์„ฑ์ž์—์„œ ๋ฐ›์€ ๊ฐ€๋ณ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐฉ์–ด์ ์œผ๋กœ ๋ณต์‚ฌ

  • ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ€๋ณ€ ํ•„๋“œ์˜ ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋„ ๋ณต์‚ฌ๋ณธ์ด ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— Period ์ธ์Šคํ„ด์Šค์— ์ง์ ‘์ ์ธ ์ ‘๊ทผ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•˜๋ฉด ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

Last updated

Was this helpful?