- 자바 제어자 (modifer)
- 클래스, 필드, 메서드, 생성자 등에게 어떠한 특징을 부여하는 문법 요소
- 접근 지정자
- 클래스, 멤버, 생성자 앞에 위치할 수 있으며, 사용 범위를 정의하는 역할
1. 멤버 및 생성자의 접근 지정자
- public > protected > default(package) > private
- 아무것도 작성하지 않으면 default 접근 지정자가 자동으로 설정
- 멤버 및 생성자에서 사용하는 4가지 접근 지정자
Class Test {
public int a;
protected int b;
int c; //default 접근 지정자 자동 설정
private int d;
public void abc();
protected void bcd();
void cde(); //default 접근 지정자 자동 설정
private void def();
}
- 멤버 및 생성자에서 사요하는 4가지 접근 지정자의 사용 가능 범위
접근 지정자 | 사용 가능 범위 |
public | 동일 패키지의 모든 클래스 + 다른 패키지의 모든 클래스에서 사용가능 |
protected | 동일 패키지의 모든 클래스 + 다른 패키지의 자식 클래스에서 사용가능 |
default | 동일 패키지의 모든 클래스에서 사용 가능 |
private | 동일 클래스에서 사용가능 |
- 패키지 abc
pacakge abc;
public class A {
public int a;
protected int b;
int c;
private int d;
void abc() {
//a,b,c,d 사용 간으
}
}
package abc;
class B {
//a,b,c 사용가능
}
패키지 bcd
package bcd;
class C {
//a 사용 가능
}
package bcd;
class D extends A {
//a,b 사용 가능
}
- Class B
- private 필드는 자신의 클래스에서만 사용할 수 있으므로 클래스 B에서 사용 불가
- default는 같은 패키지에서 얼마든지 사용할 수 있으므로 default 이상의 접근 지정자를 포함하고 있는 a,b,c 사용가능
- Class C
- a만 사용 가능
- default는 같은 패키지가 아니기 때문에 사용 불가
- protected도 다른 패키지일 때 자식 클래스 네에서만 사용 가능
- Class D
- 클래스 A를 상속한 A의 자식 클래스 (class extends A)
- a,b 사용 가능
package pack1;
public class A {
//public부터 private까지 4가지의 서로 다른 접근 지정자를 포함하고 있는 필드 선언
public int a = 1;
protected int b =2;
int c = 3;
private int d = 4;
public void print() {
//같은 클래스 내의 멤버인 print() 메서드 내부에서는 모든 접근 지정자에 접근 가능
System.out.print(a +" ");
System.out.print(b +" ");
System.out.print(c +" ");
System.out.print(d);
System.out.println();
}
}
package pack1;
public class B {
public void print() {
//객체 생성
A a = new A(); //다른 클래스의 인스턴스 멤버를 사용하기 위해 객체 생성
//멤버 활용
//클래스 A는 같은 패키지에 있으므로 public,protected, default 접근 지어자로 지정된 필드는 사용 가능
System.out.print(a.a + " ");
System.out.print(a.b + " ");
System.out.print(a.c + " ");
//System.out.print(a.d + " "); private 접근 지정자로 지정된 필드는 접근 불가능
}
}
package pack2;
import pack1.A; //pack1의 클래스 A 임포트
public class C {
public void print() {
//객체 생성
A a = new A();
//멤버 활용
//다른 패키지 내의 클래스에서는 자식 클래스가 아닐 때는 public 접근 지정자만 사용 가능
System.out.print(a.a + " ");
//System.out.print(a.b + " ");
//System.out.print(a.c + " ");
//System.out.print(a.d + " ");
System.out.println();
}
}
package pack2;
import pack1.A;
public class D extends A {
public void print() {
//멤버 활용
//자식 클래슨느 다른 패키지에 있어도 객체의 생성 없이 protected 접근 지정자 필드까지 접근 가능
System.out.print(a + " ");
System.out.print(b + " ");
//System.out.print(c + " ");
//System.out.print(d);
System.out.println();
}
}
package pack0;
//서로 다른 패키지에 있는 A,B,C,D 클래스 임포트
import pack1.A;
import pack1.B;
import pack2.C;
import pack2.D;
public class AccessModifierOfMember {
public static void main(String[] args) {
//클래스의 객체 생성 및 print() 메서드 호출
A a = new A();
B b = new B();
C c = new C();
D d = new D();
a.print();
b.print();
c.print();
d.print();
}
}
2. 클래스의 접근 지정자
- 클래스에서는 public, default 접근지정자만 사용 가능
- default 클래스는 같은 패키지 내에서만 사용 가능
- public 클래스는 다른 패키지에서도 사용 가능
- 클래스에서 사용하는 접근 지정자 (default)
package abc.bcd;
class A {
//default 클래스
}
class B {
void bcd() {
A a = new A(); //(o)
}
}
package bcd.cde;
import abc.bcd.A; // (X)
class C {
void cde() {
//A 클래스 사용(선언) 불가능
}
}
- 클래스를 default로 정의하면 다른 패키지에서 임포트 불가능
- 클래스에서 사용하는 접근 지정자(public)
package abc.bcd;
public class A {
//..
}
class B {
void bcd() {
A a = new A(); //(o)
}
}
package bcd.cde;
import abc.bcd.A; //(o)
class C {
void cde() {
//A 클래스 사용(선언) 가능
}
}
- 다른 패키지에서 클래스르 사용하기 위해서는 해당 클래스를 임포트할 수 있어야 하므로 public으로 선언해야함
3. 클래스 접근 지정자와 생성자 접근지정자의 연관성
- 자동으로 추가되는 생성자의 접근 지정자는 클래스의 접근 지정자에 따라 결정
- 클래스가 public이다 = 다른 패키지에서 임포트 가능
- 생성자가 public이다 = 다른 패키지에서 생성자를 호출해 객체 생성 가능
- 클래스가 public이면 자동으로 추가되는 생성자도 public
- 클래스가 default이면 자동으로 추가되는 생성자도 default
- public 클래스
package abc.bcd;
public class A {
//컴파일러가 public A() {} 자동으로 ㅊ우가
}
class B {
//A 클래스 사용(생성/선언) 가능
}
package bcd.cde;
import abc.bcd.A; //(o) 클래스의 접근지정자가 public이므로 임포트 가능
class C {
public static void main(String[] ar) {
A a = new A(); //(o) 접근 지정자가 public이므로 호출 가능
}
}
- 클래스와 생성자에 모두 public 접근 지정자가 있기 때문에 다른 패키지에서 클래스를 임포트하거나 생성자 호출 가능
- default 클래스
package abc.bcd;
class A {
//default 클래스
//컴파일러가 A(){} 자동으로 추가
}
class B {
//A 클래스 사용(선언/생성) 가능
}
package bcd.cde;
import abc.cde.A; //(X) 클래스의 접근 지정자가 default이므로 임포트 불가능
class C {
public static void main(String[] ar) {
A a = new A(); //(x)
//임포트되지 않았을 때 생성자의 접근 지정자와 상관없이 호출 불가능
}
}
- 직접 접근자 지정
- public 클래스, default 생성자
package abc.bcd;
public class A {
//public 클래스
A() {
//default 생성자
}
}
class B {
//A 클래스 사용(선언/생성) 가능
}
package bcd.cde;
import abc.cde.A ; //(o) 클래스의 접근 지정자가 public이므로 임포트 가능
class C {
public static void main(String[] ar) {
A a = new A(); //(X) 생성자의 접근 지정자가 default이므로 호출 불가능
}
}
- 다른 패키지에서는 클래스를 임포트할 수 있지만, 생성자를 호출할 수 없으므로 객체 자체를 생성할 수 없음
- default 클래스 , public 생성자
package abc.cde;
class A { //default 클래스
public A() {
//public 생성자
}
}
class B {
//A 클래스 사용(선언/생성) 가능
}
package bcd.cde;
import abc.cde.A; //(x) 클래스의 접근 지정자가 default이므로 임포트 불간으
class c {
public static void main(Stirng[] ar) {
A a = new A(); //(x) 임포트되지 않았을 때 생성자의 접근 지정자와 상관없이 호출 불가능
}
}
-임포트 불가능하므로 생성자가 public이라도 다른 패키지에서는 클래스 자체가 인식되지 않아 객체 생성 불가
'Java > 문법' 카테고리의 다른 글
10-1장 클래스 상속의 개념과 문법적 특징 (0) | 2023.05.04 |
---|---|
9-2장 static 제어자 (0) | 2023.04.30 |
8-2 장 외부 클래스 (0) | 2023.04.24 |
8-1장 패키지와 임포트 (0) | 2023.04.24 |
7-4장 this 키워드와 this() 메서드 (0) | 2023.04.24 |