Item 15. Access Modifier

ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ตœ์†Œํ™”ํ•˜๋ผ

์ข‹์€ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์ˆจ๊ฒจ, ๊ตฌํ˜„๊ณผ ์ œ๊ณต API๋ฅผ ๊น”๋”ํžˆ ๋ถ„๋ฆฌํ•ด์ฃผ์–ด ๊ฐœ๋ฐœ์˜ ์œ ์—ฐ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ์–ดํ•ด ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๊ฐ์ถ”๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ ‘๊ทผ ์ œํ•œ ์„ค์ • ์›์น™

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

  • package-private(default): ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ, ๋‚ด๋ถ€ ๊ตฌํ˜„์ด๋ฏ€๋กœ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

  • public: ๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ, ๊ณต๊ฐœ API๊ฐ€ ๋˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ญ์ƒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค๋‚˜ ๋ฉค๋ฒ„๋Š” package-private์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๊ฐ์ถ”๊ณ , ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ public์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ณต๊ฐœ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฉค๋ฒ„์˜ ๊ฒฝ์šฐ private, package-private, protected, public์˜ 4๊ฐ€์ง€ ์ ‘๊ทผ ์ˆ˜์ค€์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ณต๊ฐœ API๋ฅผ ์„ธ์‹ฌํžˆ ์„ค๊ณ„ํ•œ ํ›„, ๊ทธ ์™ธ์˜ ๋ฉค๋ฒ„๋Š” private์œผ๋กœ ์„ค์ •ํ•œ ๋’ค ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ ‘๊ทผ ์ˆ˜์ค€์„ ๋†’์ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๊ทธ ์™ธ์— ์ƒ์œ„ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ์‹œ, ์ƒ์œ„ ํด๋ž˜์Šค๋ณด๋‹ค ์ ‘๊ทผ ์ˆ˜์ค€์„ ์ข๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ๋„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.(๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™)

์ ‘๊ทผ ์ œํ•œ ์„ค์ • ์‹œ ์ฃผ์˜์‚ฌํ•ญ

ํ…Œ์ŠคํŠธ๋ฅผ ๋ชฉ์ ์œผ๋กœ ์ ‘๊ทผ ์ˆ˜์ค€์„ ๋†’์ด๋Š” ๊ฒฝ์šฐ์—” package-private ๊นŒ์ง€๋งŒ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

๋ณดํ†ต ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€์— ์œ„์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— package-private๊นŒ์ง€๋งŒ ํ—ˆ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

public ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋Š” ๋˜๋„๋ก public์ด ์•„๋‹ˆ์–ด์•ผ ํ•จ

public์ธ ๊ฒฝ์šฐ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. (์˜ˆ์™ธ๋กœ ํ•„์š”ํ•œ ๊ตฌ์„ฑ์š”์†Œ๋กœ์„œ ๊ธฐ๋ณธ ํƒ€์ž…์ด๋‚˜ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ƒ์ˆ˜๋ผ๋ฉด public static final๋กœ ๊ณต๊ฐœํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.)

  • final์ด ์žˆ๋”๋ผ๋„ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ๋„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Œ

  • ์ด๋ฏธ ๊ณต๊ฐœ๋œ ํ•„๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— public ํ•„๋“œ๋ฅผ ์—†์• ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆด ์ˆ˜ ์žˆ์Œ

๋งŒ์•ฝ ๊ฐ€๋ณ€(๋ฐฐ์—ด) ํ•„๋“œ๋ฅผ ๊ณต๊ฐœํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

class Example {
    // ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
    public static final Thing[] VALUES = {/* ... */};

    // ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1: public ๋ฐฐ์—ด์„ private์œผ๋กœ ๋งŒ๋“ค๊ณ  public ๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€
    private static final Thing[] PRIVATE_VALUES = {/* ... */};
    public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

    // ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 2: public ๋ฐฐ์—ด์„ private์œผ๋กœ ๋งŒ๋“ค๊ณ  public ๋ฐฐ์—ด ๋ณต์‚ฌ๋ณธ์„ ์ถ”๊ฐ€
    private static final Thing[] PRIVATE_VALUES = {/* ... */};

    public static final Thing[] values() {
        return PRIVATE_VALUES.clone();
    }
}

๋ชจ๋“ˆ ์‹œ์Šคํ…œ

Java 9์—์„œ๋Š” ์ ‘๊ทผ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๊ฐœ๋…์ด ๋„์ž…๋˜์—ˆ์ง€๋งŒ, ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•˜๊ณ  ์•„์ง๊นŒ์ง€๋Š” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋žตํ•œ๋‹ค.

Last updated