스파르타 spring 2기 TIL day12

fart man·2025년 12월 9일

Java visibility에 대한 간단한 데모 프로그램.

글고, 같은 directory 안에 다른 package를 가진 소스 파일이 둘 이상 있어도 된다는 거 아셨나요? 소스 파일은 같은 directory안에 있어도 돼요.

javac -d out *.java

저렇게 -d <path> flag를 주면 자동으로 class파일은 알맞은 directory에 넣어줍니다.

Parent.java

// ============================================================
// STUDY: This is a simple program about visibility
// ============================================================
package parent;

// =======================================================
// TLDR: members needs to be MORE visible when inherited
// =======================================================

public class Parent {
    // only class it self can access it
    private void privateMethod() {
        System.out.println("I'm private");
    }

    // only classes with in in the SAME PACAKGE can see it
    void packagePrivateMethod() {
        System.out.println("I'm package private");
    }

    // only classes with in in the SAME PACAKGE, and OTHER PACKAGE'S CHILDREN can see it
    protected void protectedMethod() {
        System.out.println("I'm protected");
    }

    // anyone can see it
    public void publicMethod() {
        System.out.println("I'm protected");
    }

    private String privateName = "private";
    String packagePrivateName = "packagePrivate";
    protected String protectedName = "protected";
    public String publicName = "public";

    class innerChild {
        innerChild() {
            // ================================================
            // inner classes are all buddies
            // they can all see each others' private members ;)
            // ================================================
            System.out.println(privateName);
            System.out.println(packagePrivateName);
            System.out.println(protectedName);
            System.out.println(publicName);
        }
    }
}

class Child extends Parent{
    // // 🚫
    // Can never override parent's private method
    // @Override
    // public void privateMethod() {
    //     System.out.println("I'm private child");
    // }
    //
    // // ✅
    // @Override
    // public void packagePrivateMethod() {
    //     System.out.println("I'm package private child");
    // }
    //
    // // ✅
    // @Override
    // public void protectedMethod() {
    //     System.out.println("I'm protected child");
    // }
    // 
    // // ✅
    // @Override
    // public void publicMethod() {
    //     System.out.println("I'm protected child");
    // }


    // 🚫
    // Can never override parent's private method!
    // @Override
    // protected void privateMethod() {
    //     System.out.println("I'm private child");
    // }
    //
    // // ✅
    // @Override
    // protected void packagePrivateMethod() {
    //     System.out.println("I'm package private child");
    // }
    //
    // // ✅
    // @Override
    // protected void protectedMethod() {
    //     System.out.println("I'm protected child");
    // }
    //
    // 🚫
    // protected is less visible than public!
    // @Override
    // protected void publicMethod() {
    //     System.out.println("I'm protected child");
    // }

    // 🚫
    // Can never override parent's private method!
    // @Override
    // private void privateMethod() {
    //     System.out.println("I'm private child");
    // }
    //
    // // 🚫
    // @Override
    // private void packagePrivateMethod() {
    //     System.out.println("I'm package private child");
    // }
    //
    // 🚫
    // private is less visible than protected!
    // @Override
    // private void protectedMethod() {
    //     System.out.println("I'm protected child");
    // }
    //
    // 🚫
    // private is less visible than public!
    // @Override
    // private void publicMethod() {
    //     System.out.println("I'm protected child");
    // }

    Child() {
        // privateName = "private child"; // 🚫
        packagePrivateName = "packagePrivate child";
        protectedName = "protected child";
        publicName = "public child";
    }
}

PackageChild.java

package childpkg;

import parent.Parent;

class PackageChild extends Parent{
    // // 🚫
    // Can never override parent's private method
    // @Override
    // public void privateMethod() {
    //     System.out.println("I'm private child");
    // }
    //
    // // 🚫
    // invisible to childpkg since package private members aren't visible to other packages
    // @Override
    // public void packagePrivateMethod() {
    //     System.out.println("I'm package private child");
    // }
    //
    // // ✅
    // @Override
    // public void protectedMethod() {
    //     System.out.println("I'm protected child");
    // }
    // 
    // // ✅
    // @Override
    // public void publicMethod() {
    //     System.out.println("I'm protected child");
    // }


    // 🚫
    // Can never override parent's private method!
    // @Override
    // protected void privateMethod() {
    //     System.out.println("I'm private child");
    // }
    //
    // // 🚫
    // invisible to childpkg since package private members aren't visible to other packages
    // @Override
    // protected void packagePrivateMethod() {
    //     System.out.println("I'm package private child");
    // }
    //
    // // ✅
    // @Override
    // protected void protectedMethod() {
    //     System.out.println("I'm protected child");
    // }
    //
    // 🚫
    // protected is less visible than public!
    // @Override
    // protected void publicMethod() {
    //     System.out.println("I'm protected child");
    // }

    // 🚫
    // Can never override parent's private method!
    // @Override
    // private void privateMethod() {
    //     System.out.println("I'm private child");
    // }
    //
    // // 🚫
    // @Override
    // private void packagePrivateMethod() {
    //     System.out.println("I'm package private child");
    // }
    //
    // 🚫
    // private is less visible than protected!
    // @Override
    // private void protectedMethod() {
    //     System.out.println("I'm protected child");
    // }
    //
    // 🚫
    // private is less visible than public!
    // @Override
    // private void publicMethod() {
    //     System.out.println("I'm protected child");
    // }

    PackageChild() {
        // privateName = "private child"; // 🚫
        // packagePrivateName = "packagePrivate child"; // 🚫
        protectedName = "protected child";
        publicName = "public child";
    }
}

0개의 댓글