JAVA

JAVA 제어자

짱코딩러 2022. 7. 17. 14:09

제어자는 하나의 대상에 여러개를 조합해 사용할 수 있는데

접근제어자는 단 하나만 사용할 수 있으며, 보통 접근 제어자를 가장 앞에 적는다.

 

접근제어자

접근 제어자 같은 클래스의 멤버 같은 패키지의 멤버 자식 클래스의 멤버 그 외의 영역
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