안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
접근 제한자란?
- 자바 제어자의 한 종류로, 클래스/멤버/생성자 앞에 위치
- 사용 범위를 정의
☞ 멤버 및 생성자의 접근 제한자
접근 제한자 | 사용 가능 범위 |
public | 동일 패키지의 모든 클래스 + 다른 패키지 모든 클래스에서 사용 가능 |
protected | 동일 패키지의 모든 클래스 + 다른 패키지의 자식 클래스에서 사용 가능 |
default(=package) | 동일 패키지의 모든 클래스에서 사용 가능 |
private | 동일 클래스에서 사용 가능 |
public, protected, default(=package), private 4가지 종류의 접근 제한자를 사용할 수 있습니다.
필드나 메서드 또는 생성자 앞에 위치!!
하지만, 아무것도 작성하지 않으면 default 접근 제한자가 자동 설정
접근 제한자 사용 범위
(좁음) private → default → protected → public (넓음)
동일 패키지의 다른 클래스에서의 접근 제한
package kh.java.oop.access.modifier.field.method;
public class Foo {
public int a = 1;
protected int b = 2;
int c = 3;
private int d = 4;
public void a() {}
protected void b() {}
void c() {}
private void d() {}
}
package kh.java.oop.access.modifier.field.method;
public class SamePackageRun {
public static void main(String[] args) {
Foo foo = new Foo();
System.out.println(foo.a);
System.out.println(foo.b);
System.out.println(foo.c);
// System.out.println(foo.d); //접근불가 (The field Foo.d is not visible)
foo.a();
foo.b();
foo.c();
// foo.d(); //접근불가 (The method d() from the type Foo is not visible)
}
}
@콘솔출력값
1
2
3
동일한 패키지 내 다른 클래스를 생성하여 Foo클래스의 a, b, c, d 변수와 Foo클래스의 a, b, c, d() 메소드를 호출해보았습니다.
동일한 클래스에서만 접근이 가능한 private을 제외하고 모두 오류 없이 출력할 수 있었습니다.
private 변수와 메소드를 호출하려고 하니, 확인 불가하다는 오류 메세지가 발생 하였습니다.
다른 패키지의 클래스에서의 접근 제한
package kh.java.oop.access.modifier.field.method;
public class Foo {
public int a = 1;
protected int b = 2;
int c = 3;
private int d = 4;
public void a() {}
protected void b() {}
void c() {}
private void d() {}
}
package kh.java.oop.access.modifier.field.method.other;
import kh.java.oop.access.modifier.field.method.Foo;
public class OtherPackageRun {
public static void main(String[] args) {
Foo foo = new Foo();
System.out.println(foo.a);
// System.out.println(foo.b); //접근불가 (The field Foo#b is not visible)
// System.out.println(foo.c); //접근불가 (The field Foo#c is not visible)
// System.out.println(foo.d); //접근불가 (The field Foo#d is not visible)
foo.a();
// foo.b(); //접근불가 (The method d() from the type Foo is not visible)
// foo.c(); //접근불가 (The method d() from the type Foo is not visible)
// foo.d(); //접근불가 (The method d() from the type Foo is not visible)
}
}
@콘솔출력값
1
public 변수는 import문을 생성해주면 접근 가능하여 a의 값을 출력할 수 있었지만,
protected, default, private은 마찬가지로 확인 불가하다는 오류 메세지가 발생 하였습니다.
☞ 클래스의 접근 제한자
접근 제한자 | 사용 가능 범위 |
public | 다른 패키지에서도 사용 가능 (import 가능) |
default | 같은 패키지에서만 사용 가능 (import 불가) |
public, default 4가지 종류의 접근 제한자를 사용할 수 있습니다.
class 키워드 앞에 접근 제한자를 생략하면 defualt 클래스라는 의미입니다.
접근 제한자 사용 범위
(좁음) default → public (넓음)
☆ .java 파일 안에는 단 하나의 public class만 존재할 수 있습니다.
동일 패키지의 다른 클래스에서의 접근 제한
package kh.java.oop.access.modifier._class;
public class A {
}
class B {
}
package kh.java.oop.access.modifier._class;
public class SamePackageMain {
public static void main(String[] args) {
A a = new A();
B b = new B(); //default 패키지 : 같은 패키지 내에서 접근 가능
}
}
public, default 클래스 모두 같은 패키지 내에서는 접근 가능하기 때문에 문제 없이 객체를 생성할 수 있었습니다.
다른 패키지의 클래스에서의 접근 제한
package kh.java.oop.access.modifier._class;
public class A {
}
class B {
}
package kh.java.oop.access.modifier._class.other;
import kh.java.oop.access.modifier._class.A;
public class OtherPackageMain {
public static void main(String[] args) {
A a = new A();
// B b = new B(); //default 클래스 : 다른 패키지에서는 접근이 불가
}
}
public 클래스는 import문을 사용하여 다른 패키지에서도 객체 생성이 가능하였지만,
default 클래스는 import문 자체가 사용이 불가하고, 다른 패키지에서는 접근이 불가하므로 객체 생성이 불가합니다.
'Java > Java' 카테고리의 다른 글
메소드) 메소드 오버로딩, 메소드 시그니처란? (0) | 2022.03.17 |
---|---|
메소드) 인스턴스 메소드, static 메소드 (0) | 2022.03.17 |
변수) 인스턴스 변수의 초기화 순서, static 변수의 초기화 순서 (0) | 2022.03.16 |
변수) 변수 별 생명 주기 Liftcycle (0) | 2022.03.16 |
변수) 전역변수(인스턴스 변수, static 변수), 지역변수 (0) | 2022.03.16 |