제어자는 하나의 대상에 여러개를 조합해 사용할 수 있는데
접근제어자는 단 하나만 사용할 수 있으며, 보통 접근 제어자를 가장 앞에 적는다.
접근제어자
접근 제어자 | 같은 클래스의 멤버 | 같은 패키지의 멤버 | 자식 클래스의 멤버 | 그 외의 영역 |
public | O | O | O | O |
protected | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
public
모든 영역에서 사용 가능
protected
클래스, 패키지 달라도 자식클래스면 사용 가능
(default)
클래스 달라도 같은 패키지면 사용 가능
private
같은 클래스일때만 사용 가능
package pkg1;
public class MyParent {
//=>1.이거 그냥 (default) class MyParent로 만들었다가, 다른 패키지에서도 쓸려고 public 붙여줬음
//3.public클래스랑 소스파일이랑 이름 같아야 돼서 소스파일 이름도 바꿔줬음 MyParentTest->MyParent
private int prv; // 같은 클래스
int dft; // 같은 패키지
protected int prt; // 같은 패키지 + 자손(다른 패키지)
public int pub; // 접근제한 없음.
public void printMembers() {
System.out.println(prv);
System.out.println(dft);
System.out.println(prt);
System.out.println(pub);
}
}
class MyParentTest {
//=>2. 이거 원래 public class MyParentTest였는데 MyParent에 붙이느라 뗐다.(default)
public static void main(String[] args) {
MyParent p = new MyParent();
System.out.println(p.prv); //err. private 다른 클래스에서는 사용할 수 X
System.out.println(p.dft);
System.out.println(p.prt);
System.out.println(p.pub);
}
}
package pkg2;
import pkg1.MyParent; //임포트 필수~
//아니면 class MyChild extends pkg1.MyParent { 이렇게 이름을 붙여줘도 됨
class MyChild extends MyParent { //MyParent 가져다 쓸려고 뭘했는지 MyParent파일에서 봐라..(1~3)
public void printMembers() {
System.out.println(prv); //err. private 다른 클래스(+패키지)에서는 사용할 수 X
System.out.println(dft); //err. default 다른 패키지에서는 사용할 수 X
System.out.println(prt);
System.out.println(pub);
}
}
public class MyParentTest2 {
public static void main(String[] args) {
MyParent p = new MyParent();
System.out.println(p.prv); //err. private 다른 클래스에서는 사용할 수 X
System.out.println(p.dft); //err. default 다른 패키지에서는 사용할 수 X
System.out.println(p.prt); //err. protected 자손조차 아닌 곳에서는 사용할 수 X
System.out.println(p.pub); //public 제한 X
}
}
그 외 제어자
static
멤버변수에 붙으면 : 모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다.(인스턴스 생성 없이 사용 가능)
메서드에 붙으면 : 인스턴스를 생성하지 않고도 호출이 가능한 static메서드가 된다.(인스턴스 멤버 사용 불가)
class StsticTest {
static int width = 200; //클래스 변수(static변수)
static int height = 120; //클래스 변수(static변수)
static { //클래스 초기화 블럭
//static변수의 복잡한 초기화 수행
}
static int max(int a, int b) { //클래스 메서드(static메서드)
return a > b ? a : b;
}
}
final
클래스에 붙으면 : 확장될 수 없는 클래스가 된다.(조상이 될 수 X)
메서드에 붙으면 : 오버라이딩을 할 수 없게 된다.(조상 메서드 덮어쓸 수 X)
변수에 붙으면 : 상수가 된다.(변경 불가)
class FinalTest { //조상이 될 수 없는 클래스
final int MAX_SIZE = 10; //값을 변경할 수 없는 멤벼변수(상수)
final void getMaxSize() { //오버라이딩 할 수 없는 메서드(변경불가)
final int LV = MAX_SIZE; //값을 변경할 수 없는 지역변수(상수)
return MAX_SIZE;
}
}
abstract
클래스에 붙으면 : 미완성 클래스, 미완성 설계도
(뭐가 부족하다기 보다 그냥 추상메서드가 있으면 무조건 미완성 클래스가 됨)
메서드에 붙으면 : 선언부만 작성하고 구현부{}는 작성하지 않은 추상 메서드
=>다른애가 추상클래스를 상속받아서 완전한 클래스를 만든 후에 객체 생성 가능.
abstract class AbstractTest { //추상 클래스(추상 메서드를 포함한 클래스)
abstract void move(); //추상 메서드(구현부{}가 없는 메서드)
}
AbstractTest a = new AbstractTesst(); //err. 추상 클래스의 인스턴스 생성 불가
'JAVA' 카테고리의 다른 글
JAVA (메서드)오버라이딩 (0) | 2022.07.18 |
---|---|
JAVA 인자전달 (0) | 2022.07.17 |
JAVA 변수 초기화 (0) | 2022.07.17 |
JAVA static 메서드, 인스턴스 메서드 (0) | 2022.07.16 |
JAVA 변수의 종류 인스턴스변수, 클래스변수, 지역변수 (0) | 2022.07.16 |