Programming/Java

์ ‘๊ทผ ์ œ์–ด์ž

UNarD 2025. 4. 17. 17:19

๐Ÿ” ์ž๋ฐ” ์ ‘๊ทผ ์ œ์–ด์ž

์ž๋ฐ”๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด public, private, protected... ์ด๋Ÿฐ ํ‚ค์›Œ๋“œ๋“ค์ด ๊ณ„์† ๋‚˜์˜ค๋Š”๋ฐ
์ •ํ™•ํžˆ ์–ด๋””๊นŒ์ง€ ์ ‘๊ทผ์ด ๋˜๋Š” ๊ฑด์ง€ ํ—ท๊ฐˆ๋ฆด ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์žŠ์ง€ ์•Š๊ฒŒ ์˜ค๋Š˜ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค โœจ


๐Ÿคท ์ ‘๊ทผ ์ œ์–ด์ž๋ž€?

์ ‘๊ทผ ์ œ์–ด์ž๋Š” ํด๋ž˜์Šค๋‚˜ ํด๋ž˜์Šค ๋ฉค๋ฒ„(ํ•„๋“œ, ๋ฉ”์„œ๋“œ ๋“ฑ)์— "๋ˆ„๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?" ๋ฅผ ์ •ํ•ด์ฃผ๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

๐Ÿค” ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•ด๋ณด์ž๋ฉด,

๊ฑด๋ฌผ ์ถœ์ž…์ฆ ๊ฐ™์€ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์—ญ์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ ‘๊ทผ ์ œ์–ด์ž๋„ ๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๐Ÿ›ก๏ธ ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ข…๋ฅ˜

์ ‘๊ทผ ์ œ์–ด์ž ์ ‘๊ทผ ๊ฐ€๋Šฅ ๋ฒ”์œ„
private ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด๋ถ€ ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
(default) ๊ฐ™์€ ํŒจํ‚ค์ง€ ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ (๋ณ„๋„ ํ‚ค์›Œ๋“œ ์—†์ด ์„ ์–ธ๋œ ๊ฒฝ์šฐ)
protected ๊ฐ™์€ ํŒจํ‚ค์ง€ + ์ƒ์† ๊ด€๊ณ„์˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ํด๋ž˜์Šค ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
public ์–ด๋””์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅ

โš ๏ธ default๋Š” ์•„๋ฌด ํ‚ค์›Œ๋“œ๋„ ๋ถ™์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
์ •์‹ ๋ช…์นญ์€ package-private์ž…๋‹ˆ๋‹ค.

๐Ÿ‘€ ๋น„๊ตํ‘œ๋กœ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

์ ‘๊ทผ ์ œ์–ด์ž ๊ฐ™์€ ํด๋ž˜์Šค ๊ฐ™์€ ํŒจํ‚ค์ง€ ํ•˜์œ„ ํด๋ž˜์Šค(๋‹ค๋ฅธ ํŒจํ‚ค์ง€) ์ „์ฒด
private โœ… โŒ โŒ โŒ
default โœ… โœ… โŒ โŒ
protected โœ… โœ… โœ… โŒ
public โœ… โœ… โœ… โœ…

๐Ÿ‘† ์ž๋ฐ”๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ "๊ฐ์ถ”๋Š” ๊ฒŒ ๊ธฐ๋ณธ"์ž…๋‹ˆ๋‹ค.
๊ผญ ๊ณต๊ฐœํ•ด์•ผ ํ•  ๋ฉค๋ฒ„์—๋งŒ public์„ ๋ถ™์—ฌ์ฃผ์„ธ์š”!


๐Ÿ’ฌ ์‹ค์ „ ์˜ˆ์ œ๋กœ ์ดํ•ดํ•˜๊ธฐ

ํด๋ž˜์Šค ์ •์˜
public class Parent {

    private String password = "๋‚˜๋งŒ ์•Œ๊ณ  ์‹ถ์–ด";          // private - ํด๋ž˜์Šค ๋‚ด๋ถ€๋งŒ
            String teamCode = "๊ฐ™์€ ํŒจํ‚ค์ง€๋ผ๋ฉด OK";      // default - ๊ฐ™์€ ํŒจํ‚ค์ง€๊นŒ์ง€
    protected String employeeId = "์ž์‹ ํด๋ž˜์Šค์—๊ฒŒ๋งŒ";   // protected - ์ƒ์† ๊ด€๊ณ„๊นŒ์ง€
    public String name = "๋ˆ„๊ตฌ๋“  ํ™˜์˜!";                 // public - ์ „์ฒด ๊ณต๊ฐœ
}
๊ฐ™์€ ํŒจํ‚ค์ง€์—์„œ ์ ‘๊ทผ
public class SamePackage {
    public static void main(String[] args) {
        Parent parent = new Parent();

        // โŒ private โ†’ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€
        // System.out.println(parent.password);

        // โœ… default โ†’ ๊ฐ™์€ ํŒจํ‚ค์ง€ ์•ˆ์—์„œ๋Š” ์ ‘๊ทผ ๊ฐ€๋Šฅ
        System.out.println(parent.teamCode);

        // โœ… protected โ†’ ๊ฐ™์€ ํŒจํ‚ค์ง€ or ์ƒ์† ๊ด€๊ณ„๋ผ๋ฉด OK
        System.out.println(parent.employeeId);

        // โœ… public โ†’ ๋ˆ„๊ตฌ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅ
        System.out.println(parent.name);
    }
}
๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์ ‘๊ทผ
public class DifferentPackage {
    public static void main(String[] args) {
        Parent parent = new Parent();

        // โŒ private โ†’ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€
        // System.out.println(parent.password);

        // โŒ default โ†’ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€
        // System.out.println(parent.teamCode);

        // โŒ protected โ†’ ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ฉด ์ ‘๊ทผ ๋ถˆ๊ฐ€
        // System.out.println(parent.employeeId);

        // โœ… public โ†’ ์–ด๋””์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅ!
        System.out.println(parent.name);
    }
}
๋‹ค๋ฅธ ํŒจํ‚ค์ง€ + ์ƒ์† ๊ด€๊ณ„์—์„œ ์ ‘๊ทผ
public class Child extends Parent {
    public void testInherited() {
        // โœ… protected โ†’ ์ž์‹ ํด๋ž˜์Šค ์•ˆ์—์„œ๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—ฌ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ
        System.out.println(employeeId);
    }
}

๐Ÿšซ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•˜๋ฉด
๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค! ๐Ÿšซ


๐ŸŽฏ ์–ธ์ œ ์–ด๋–ค ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ์“ธ๊นŒ?

๊ธฐ๋ณธ ์›์น™์€ "์ตœ์†Œํ•œ์œผ๋กœ ๊ณต๊ฐœํ•˜๊ธฐ"์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์—ด์–ด๋‘๋Š” ๊ฒŒ ์ข‹์€ ์„ค๊ณ„์ž…๋‹ˆ๋‹ค.

์ƒํ™ฉ ์ถ”์ฒœ ์ ‘๊ทผ์ž ์ด์œ 
๋‚ด๋ถ€์—์„œ๋งŒ ์“ฐ๋Š” ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ private ์™ธ๋ถ€์— ๋…ธ์ถœํ•  ํ•„์š” ์—†์Œ, ์บก์Аํ™” ๋ชฉ์ 
๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ ๊ณต์œ ํ•  ๋•Œ (default) ๊ฐ„๋‹จํ•œ ๋ชจ๋“ˆ ๊ตฌ์„ฑ์— ์œ ์šฉ
์ƒ์†๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค๊นŒ์ง€ ํ—ˆ์šฉ protected ์ƒ์† ๊ด€๊ณ„์—์„œ ์œ ์—ฐํ•œ ๊ตฌ์กฐ
์–ด๋””์„œ๋“  ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•ด์•ผ ํ•  ๋•Œ public ๋ชจ๋“  ํด๋ž˜์Šค์— ์ ‘๊ทผ ํ—ˆ์šฉ

โ˜• ๋งˆ๋ฌด๋ฆฌ

ํ‚ค์›Œ๋“œ ๊ณต๊ฐœ ๋ฒ”์œ„ ์ž์ฃผ ์“ฐ์ด๋Š” ์šฉ๋„
private ํด๋ž˜์Šค ๋‚ด๋ถ€ ํ•„๋“œ, ํ—ฌํผ ๋ฉ”์„œ๋“œ ๋“ฑ ์ˆจ๊ธธ ๋•Œ
(default) ๊ฐ™์€ ํŒจํ‚ค์ง€ ๊ฐ„๋‹จํ•œ ํŒจํ‚ค์ง€ ๋‹จ์œ„ ๊ตฌ์„ฑ์šฉ
protected ๊ฐ™์€ ํŒจํ‚ค์ง€ + ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ์ž์‹ ํด๋ž˜์Šค ์ƒ์† ์‹œ ๋ถ€๋ชจ์˜ ๊ธฐ๋Šฅ ๊ณต์œ 
public ์–ด๋””์„œ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, API, ์ง„์ž…์ (main) ๋“ฑ ๊ณต๊ฐœ