공부 중 메모/JAVA

5. JAVA의 접근제한자

라이피 (Lypi) 2022. 3. 19. 22:23
반응형

1. 자바는 처음부터 객체지향 프로그래밍 언어이다. 그래서 자바는 클래스로 시작해서 클래스로 끝난다.

2. 자바에서는 하나의 클래스마다 하나의 파일을 만드는 것을 추천한다.

3. 하나의 파일에 여러개의 클래스를 넣을 수는 있지만 public클래스는 하나만 넣을 수 있다.

4. 클래스 내부의 클래스를 내부 클래스(inner class) 내부 클래스가 아닌 클래스를 최상위 클래스라고 한다.

5. 최상위 클래스의 접근 지정자로는 public을 쓰거나 생략할 수 있다. private와 protected는 쓸 수 없다.

6. public은 다른 패키지에서 접근 가능한 클래스이고, 생략시 불가능하다. 부모 클래스로도 쓸 수 없다.

7. 즉, 클래스에 대한 접근 지정자는 JAVA와 Cpp가 꽤나 다르다.

8. java에서는 클래스들을 패키지로 구분해서 다루며, 패키지명은 폴더명과 같아야 한다.

9. 즉, 클래스는 파일 단위로 관리하고, 이 파일들을 담은 폴더를 패키지로 관리한다고 생각하면 된다.

10. 다른 패키지는 import로 가져올 수 있다.

11. 클래스의 멤버 변수는 자바에서는 필드라고 부르고, 멤버 함수는 메소드라고 부른다.

12. 자바에서는 클래스 밖에 변수나 함수를 선언할 수 없으므로 Cpp같은 전역 변수나 전역 함수는 없다.

13. 자바의 접근제한자(=접근지정자, access modifier)는 public, (생략), protected, private의 4가지가 있다.

 

접근지정자 선언된
클래스에서
같은 패키지의
다른 클래스에서
상속받은
클래스에서
다른 패키지의
클래스에서
public 접근 가능 접근 가능 접근 가능 접근 가능
protected 접근 가능 접근 가능 접근 가능 접근 불가
생략 접근 가능 접근 가능 접근 불가 접근 불가
private 접근 가능 접근 불가 접근 불가 접근 불가

 

internal 폴더의 BCG class

package internal;

import extern.*;

//자바에서는 하나의 파일에 하나의 public class가 있어야 한다.
//그리고 파일명과 pubilc클래스의 명칭이 같아야 한다.
//그러므로 자바에서는 "하나의 public class는 하나의 파일이다."라는 명제는 항상 참이다.
//하지만 그 역인 "하나의 파일은 하나의 pulic class이다"라는 명제는 참이 아닐 수도 있다
//이 public클래스는 파일의 최상위에 위치해야한다.

public class BCG extends extension_class {

    // main함수는 프로그램의 시작점이다.
    // main함수의 위치는 실행하려는 파일의 public 클래스 안이어야 한다.
    // main함수는 public 함수이면서 static 함수여야 한다.
    // 또한 반환값은 void, 인자는 String 한개여야 한다고 정해져 있다.
    public static void main(String args[]) {
        // 함수들은 static이 아니므로 static함수인 main함수에서 사용하려면 클래스의 인스턴스를 만들고 그 인스턴스에서 호출해야한다.
        // in_ 멤버변수는 static으로 만들었으므로 바로 static함수인 main함수에서 사용할 수 있다.
        BCG thisBCG = new BCG();
        System.out.println(thisBCG.BCG_public() + in_);
        System.out.println(thisBCG.BCG_protected() + in_);
        System.out.println(thisBCG.BCG_default() + in_);
        System.out.println(thisBCG.BCG_private() + in_);
        System.out.println();

        internal_class icInstance = new internal_class();
        System.out.println(icInstance.ic_public() + in_);
        System.out.println(icInstance.ic_protected() + in_);
        System.out.println(icInstance.ic_default() + in_);
        // private 메소드는 선언된 클래스에서만 사용 가능하다.
        // System.out.println(icInstance.ic_private() + in_);
        System.out.println();

        icInstance.not_main();
        System.out.println();

        extension_class escInstance = new extension_class();
        System.out.println(escInstance.esc_public() + in_);
        // protected 메소드는 상속받은 클래스에서 쓸 수 있지만 부모 클래스의 인스턴스임을 명확하게 해야한다.
        // System.out.println(escInstance.esc_protected() + in_);
        // 즉 자식 클래스에서 부모 클래스의 메소드를 호출해야한다.
        System.out.println(thisBCG.esc_protected() + in_);
        // default 메소드는 같은 패키지의 클래스에서만 사용 가능하다.
        // System.out.println(escInstance.esc_default() + in_);
        // private 메소드는 선언된 클래스에서만 사용 가능하다.
        // System.out.println(icInstance.ic_private() + in_);
        System.out.println();

        escInstance.esc_not_main();
        System.out.println();

        extern_class exInstance = new extern_class();
        System.out.println(exInstance.ex_public() + in_);
        // protected 메소드는 상속받은 클래스에서 쓸 수 있다.
        // System.out.println(exInstance.ex_protected() + in_);
        // extern_class는 상속받지 않았으므로 나오지 않는다.
        // System.out.println(thisBCG.ex_protected() + in_);
        // default 메소드는 같은 패키지의 클래스에서만 사용 가능하다.
        // System.out.println(exInstance.ex_default() + in_);
        // private 메소드는 선언된 클래스에서만 사용 가능하다.
        // System.out.println(exInstance.ex_private() + in_);
        System.out.println();

        exInstance.ex_not_main();
        System.out.println();
    }

    // 같은 클래스의 함수인 main함수에서만 실행할 것이므로 private로 선언함.
    private static String in_ = "호출 장소 : BCG 내부";

    // public 메소드는 선언된 클래스 내부뿐 아니라 다른 패키지의 클래스에서도 사용가능
    public String BCG_public() {
        return "public 클래스의 public 메소드";
    }

    // protected 메소드는 클래스 내부와 같은 패키지의 다른 클래스, 이 클래스를 상속받은 다른 패키지의 클래스에서 사용가능
    protected String BCG_protected() {
        return "public 클래스의 protected 메소드";
    }

    // default 메소드는 선언된 클래스 내부부터 같은 패키지의 다른 클래스까지 사용가능
    String BCG_default() {
        return "public 클래스의 default 메소드";
    }

    // private 메소드는 선언된 클래스 내부에서만 사용가능
    private String BCG_private() {
        return "public 클래스의 private 메소드";
    }
}

 

 

internal 폴더의 internal_class 클래스

package internal;

class internal_class {
    private String in_ = "호출 장소 : BCG 외부의 같은 패키지의 internal_class 클래스";

    // public 메소드는 선언된 클래스 내부뿐 아니라 다른 패키지의 클래스에서도 사용가능
    public String ic_public() {
        return "같은 패키지의 외부 default 클래스의 public 메소드";
    }

    // default 메소드는 선언된 클래스 내부부터 같은 패키지의 다른 클래스까지 사용가능
    String ic_default() {
        return "같은 패키지의 외부 default 클래스의 default 메소드";
    }

    // protected 메소드는 클래스 내부와 상속받은 클래스에서 사용가능
    protected String ic_protected() {
        return "같은 패키지의 외부 default 클래스의 protected 메소드";
    }

    // private 메소드는 선언된 클래스 내부에서만 사용가능
    private String ic_private() {
        return "같은 패키지의 외부 default 클래스의 private 메소드";
    }

    public void not_main() {
        System.out.println(ic_public() + in_);
        System.out.println(ic_default() + in_);
        System.out.println(ic_protected() + in_);
        System.out.println(ic_private() + in_);
    }
}

 

extern 패키지의 extension_class 클래스

package extern;

//다른 패키지에서 확인하려면 public이어야 한다.
public class extension_class {
    // 같은 패키지의 다른 클래스에서 실행할 것이므로 default로 선언함
    private String in_ = "호출 장소 : BCG의 부모인 extension_class";

    // public 메소드는 선언된 클래스 내부뿐 아니라 다른 패키지의 클래스에서도 사용가능
    public String esc_public() {
        return "부모 클래스의 public 메소드";
    }

    // default 메소드는 선언된 클래스 내부부터 같은 패키지의 다른 클래스까지 사용가능
    String esc_default() {
        return "부모 클래스의 default 메소드";
    }

    // protected 메소드는 클래스 내부와 상속받은 클래스에서 사용가능
    protected String esc_protected() {
        return "부모 클래스의 protected 메소드";
    }

    // private 메소드는 선언된 클래스 내부에서만 사용가능
    private String esc_private() {
        return "부모 클래스의 private 메소드";
    }

    public void esc_not_main() {
        System.out.println(esc_public() + in_);
        System.out.println(esc_default() + in_);
        System.out.println(esc_protected() + in_);
        System.out.println(esc_private() + in_);
    }
}

 

extern 패키지의 extern_class 클래스

package extern;

//다른 패키지에서 확인하려면 public이어야 한다.
public class extern_class {

    private String in_ = "호출 장소 : 외부 패키지의 extern_class 클래스";

    // public 메소드는 선언된 클래스 내부뿐 아니라 다른 패키지의 클래스에서도 사용가능
    public String ex_public() {
        return "외부 패키지에 있는 클래스의 public 메소드";
    }

    // default 메소드는 선언된 클래스 내부부터 같은 패키지의 다른 클래스까지 사용가능
    String ex_default() {
        return "외부 패키지에 있는 클래스의 default 메소드";
    }

    // protected 메소드는 클래스 내부와 상속받은 클래스에서 사용가능
    protected String ex_protected() {
        return "외부 패키지에 있는 클래스의 protected 메소드";
    }

    // private 메소드는 선언된 클래스 내부에서만 사용가능
    private String ex_private() {
        return "외부 패키지에 있는 클래스의 private 메소드";
    }

    public void ex_not_main() {
        System.out.println(ex_public() + in_);
        System.out.println(ex_default() + in_);
        System.out.println(ex_protected() + in_);
        System.out.println(ex_private() + in_);
    }
}

 

반응형