【Java】액세스 한정자 public과 무지정의 필드 액세스를 시도했다【Eclipse】

13508 단어 이클립스자바

클래스에 사용할 액세스 한정자




액세스 한정자
설명


공개
어디서나 액세스 가능

무지정
이 패키지 내에서만 액세스 가능


멤버 (필드 메서드)에 사용할 액세스 한정자




액세스 한정자
설명


공개
어디서나 액세스 가능

protected
같은 패키지내와 서브 클래스로부터 액세스 가능

무지정
이 패키지 내에서만 액세스 가능

private
같은 클래스 내에서만 액세스 가능


클래스에 무지정으로 멤버에게 private라면 어떻게 될까?



작성한 파일은 아래와 같다.


수업
파일 이름


main 클래스
Modifier.java(main 폴더)

public 클래스
Pub.java(test 폴더)

무지정 클래스
None.java(test 폴더)



Modifier.java (메인 메소드를 기재)
package main;

import test.None; // Eclipseで実行時に削除されました
import test.Pub;
public class Modifier {

    public static void main(String[] args) {
        Pub pubclass = new Pub();
        None noneclass = new None();
        System.out.println(pubclass.pubpub);
        System.out.println("publicクラスのprotectedフィールドにアクセス");
        System.out.println(pubclass.pubpro);
        System.out.println("publicクラスの無指定フィールドにアクセス");
        System.out.println(pubclass.pubnone);
        System.out.println("publicクラスのprivateフイールドにアクセス");
        System.out.println(pubclass.pubpri);
        System.out.println("無指定クラスのpublicフィールドにアクセス");
        System.out.println(noneclass.nonepub);
        System.out.println("無指定クラスのprotectedフィールドにアクセス");
        System.out.println(noneclass.nonepro);
        System.out.println("無指定クラスの無指定フィールドにアクセス");
        System.out.println(noneclass.nonenone);
        System.out.println("無指定クラスのprivateフィールドにアクセス");
        System.out.println(noneclass.nonepri);
    }
}

Pub.java
package test;

public class Pub {
    public String pubpub = "pubpub";
    protected String pubpro = "public proteced";
    String pubnone = "public none";
    private String pubpri = "pubpri";
}


None.java
package test;

class None {
    public String nonepub = "nonepub";
    protected String nonepro = "nonepro";
    String none = "nonenone";
    private String nonepri = "nonepri";
}

익명 클래스는 가져올 수 없습니다!



위에서도 코멘트로 쓴대로, Modifier.java 안에

import test.None;

라고 썼는데, Eclipse에서 실행하면 삭제되었습니다. 콘솔의 에라~메시지는
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    None を型に解決できません
    None を型に解決できません
    フィールド Pub.pubpro は不可視です
    フィールド Pub.pubnone は不可視です
    フィールド Pub.pubpri は不可視です

    at main.Modifier.main(Modifier.java:8)


public-public이면 문제 없음



Pub.java
// public以外をコメントアウトしました
package test;

public class Pub {
    public String pubpub = "pubpub";
//  protected String pubpro = "public proteced";
//  String pubnone = "public none";
//  private String pubpri = "pubpri";
}

None.java
// public修飾子をクラスに追加しました
// public以外をコメントアウトしました
package test;

public class None {
    public String nonepub = "nonepub";
//  protected String nonepro = "nonepro";
//  String none = "nonenone";
//  private String nonepri = "nonepri";
}


Modifier.java
// 出力を全部コメントアウトにしました
// パッケージのpublic修飾子のフィールドだけ呼び出すように追加しました

package main;

import test.None; // publicクラスにしたので消されずインポートできるようになりました
import test.Pub;
public class Modifier {

    public static void main(String[] args) {
        Pub pubclass = new Pub();
        None noneclass = new None();
        System.out.println(pubclass.pubpub);
        System.out.println(noneclass.nonepub);

//      System.out.println(pubclass.pubpub);
//      System.out.println("publicクラスのprotectedフィールドにアクセス");
//      System.out.println(pubclass.pubpro);
//      System.out.println("publicクラスの無指定フィールドにアクセス");
//      System.out.println(pubclass.pubnone);
//      System.out.println("publicクラスのprivateフイールドにアクセス");
//      System.out.println(pubclass.pubpri);
//      System.out.println("無指定クラスのpublicフィールドにアクセス");
//      System.out.println(noneclass.nonepub);
//      System.out.println("無指定クラスのprotectedフィールドにアクセス");
//      System.out.println(noneclass.nonepro);
//      System.out.println("無指定クラスの無指定フィールドにアクセス");
//      System.out.println(noneclass.nonenone);
//      System.out.println("無指定クラスのprivateフィールドにアクセス");
//      System.out.println(noneclass.nonepri);
    }
}

실행 결과
pubpub
nonepub

오류가 발생하지 않고 실행할 수 있습니다.

결론


  • 액세스 수식자 무지정 클래스는 import 할 수 없다
  • public 클래스의 public 만 액세스 할 수 있습니다.

    그렇게 될까 생각합니다.

    무지정 클래스는 철벽의 방어
    public 클래스에서도 public 이외의 멤버는 철벽의 보호

    그렇다면 괜찮습니까?

    무지정 클래스는 패키지 밖에서는 사용할 수 없기 때문에, 패키지내에서만 사용할 수 있다고 하는 것이기 때문에, 추상 클래스등에서 상속등으로 사용하는 것일까요. 그 근처가 아직 모호하지만,,,

    원래 Eclipse로 쓰고 있을 때마다 붉은 물결로 오류를 알려주었습니다. 그 편리함을 깨달은 것만으로도 써 보았던 가치는 있었습니다.



    우선
    초보자의 참고에 익숙해지면 다행입니다!
  • 좋은 웹페이지 즐겨찾기