JAVA

221011 접근제한자

주영재 2022. 10. 11. 12:07

접근 제한자(Access Modifier)

접근 제한자는 (클래스, 멤버변수, 메서드, 생성자)의 접근을 제어할 수 있는 제한자입니다.
접근 제한자는 가장 처음에 쓰인다.
public class ~~{ 에서 public 이 접근제한자

클래스에는 접근제한자를 public과 default만 붙일 수 있다.
생성자에 접근제한자를 붙이면 외부에서 호출을 못하게 할 수 있다.
접근제한자를 통해 객체의 특정 데이터를 보호할 수 있다.


접근제한자 종류
1. pulic -어디서나 사용가능. 패키지 기준 아무곳에서나 사용할 수 있다. 패키지가 달라도 사용가능.
2. protected-같은 패키지에서 접근 가능. super를 통한 접근 가능. 상속관계를 줄 수 있다. 
3. default(아무것도 붙이지 않는 형태)-같은 패키지에서만 접근 가능. 패키지가 다르면 접근불가능
4. private-public과 정반대. 같은 클래스 에서만 사용가능. 

자바에서 색깔도 다르게 나온다. 초록색은 public, 노란색은 protected, 파란색은 default, 빨간색은 private 

 

접근제한자가 적혀 있지 않다면 default이다.

 

 

패키지

package day07.modi.cls.pac1;
//클래스에 붙는 접근제어자는 public, default
class A {

}



package day07.modi.cls.pac2;

import day07.modi.cls.pac1.*;

public class B {
	
	//A클래스 접근-default는 같은 패키지에서만 접근가능
//	A a = new A(); 

}

위 아래 클래스는 다른 패키지에 생성되어 있음. 때문에 default인 A클래스는 B클래스에서 객체생성 불가능

 

생성자

package day07.modi.construct.pac1;

public class A {
	
	//생성자
	public A(int i){}
	A(boolean b){}
	private A(String s){}
	
}




package day07.modi.construct.pac1;
public class B {

	A a = new A(10);//ok-public
	A b = new A(true);//ok-default
//	A c = new A("a");//no-private
}




package day07.modi.construct.pac2;
import day07.modi.construct.pac1.A;
public class C {

	A a = new A(10);//ok-public
//	A b = new A(true);//no-default
//	A c = new A("a");//no-private
}

A와 B는 같은 패키지에 생성되어 있다. 따라서 private을 제외한 모든 접근제한 생성자에 접근가능 

그러나, C는 다른 패키지에 생성되어 있기 때문에 default 접근제한 생성자는 접근이 불가능하다.

 

 

멤버변수

package day07.modi.member.pac1;

public class A {

	//멤버변수
	public int var1;
	int var2;
	private int var3;
	
	public void method01() {}
	void method02() {}
	private void method03() {}
	
	//생성자
	public A() {
		this.var1=1;
		this.var2=2;
		this.var3=3; //private 
		
		this.method01();
		this.method02();
		this.method03();
		
	}
}
package day07.modi.member.pac1;

public class B {

	//A의 기능
	public B() {
		A a = new A();
		a.var1=1;
		a.var2=2;
		//a.var3=3;//no-private
		
		a.method01();
		a.method02();
		//a.method03();//no-private
	}
	
	
	
}
package day07.modi.member.pac2;

import day07.modi.member.pac1.A;

public class C {
	public C() {
	A a = new A();
	a.var1=1;
	//a.var2=2;//no-default
	//a.var3=3;//no-private

	a.method01();
	//a.method02();//no-default
	//a.method03();//no-private
	}
}

A와 B는 같은 패키지에, C는 다른 패키지에 생성되어 있다. 따라서 멤버변수는 default일 경우 A와 B에서 모두 사용가능하지만, C에서는 사용이 불가능하다. 또한 private 멤버변수는 A에서만 사용이 가능하다.

 

protected

package day07.modi.protec.pac1;

public class A {
	/*
	 * protected는 기본적으로 같은 패키지에서만 사용할 수 있습니다.(default 동일)
	 * 단, 패키지가 다르더라도 상속관계에서 super를 통한 접근은 가능함
	 */
	
	protected String s;
	
	protected A() {
		
	}
	
	protected void method01() {
		
	}

}
package day07.modi.protec.pac1;

public class B {
	//생성자
	public B() {
		A a = new A();
		a.s="홍길동";//동일 패키지 접근가능
		a.method01();
		
	}
}

protected 다른 클래스

package day07.modi.protec.pac2;

import day07.modi.protec.pac1.A;

public class C extends A{
	public C() {
//		A a= new A(); 
//		a.s="홍길동";
//		a.method01();
	
		//패키지가 다르더라도, super키워드를 통한 접근은 가능
		super();
		super.s = "홍길동";
		super.method01();
	
	
	}
}

접근제한자가 protected일 경우 default와 동일하나, super키워드를 사용한다면 다른 패키지에서도 사용이 가능하다.

때문에 우선 상속을 받은 후 super()를 통해 같은 생성자를 호출하고, super.을 이용해 protected 유형 접근제한의 멤버변수와 메서드를 상속받은 자식 클래스에서 사용할 수 있다.