시청자 여러분, 오늘은 인터뷰에서 자주 묻는 질문이기도 한 자바의 접근 한정자 관련 이슈에 대해 이야기해보겠습니다.
간단히 말하면 코드 작성자는 코드에 액세스할 수 있는 시기와 코드에 액세스할 수 없는 시기를 구별하기 위해 액세스 한정자를 만듭니다. Java의 액세스 제한은 친화적(소위 기본 유형), 공개, 비공개 및 보호의 네 가지 범주로 나뉩니다.
오늘은 구별하기 어려운 두 가지 범주, 즉 친근함과 보호에 대해 살펴보겠습니다.
먼저 친근함부터 살펴보겠습니다. 멤버 앞에 수식자를 추가하지 않으면 해당 멤버의 액세스 수준이 기본 수준이 됩니다. 이때 해당 클래스와 동일한 패키지에 있는 다른 클래스는 이러한 멤버에 액세스할 수 있지만, 다른 패키지 클래스에 있는 클래스에서는 액세스할 수 없습니다.
Java 코드
package com.a1
/**
* A는 com.a1 패키지에 속합니다
* @author Will
*
*/
public class; A {
//구성원은 기본 액세스 수준입니다
int i
String str
void print(){
System.out.println("i:"+i+";str:"+str)
}
}
Java 코드
패키지 com.a1;
/**
* testA1은 com.a1에 속합니다
* @author Will
*
*/
public class testA1 {
public static void main( String[] args) {
//testA1과 A는 동일한 패키지에 속하므로 친숙한 멤버에 액세스할 수 있습니다.
A a=new A()
시스템 .out.println(a.i);
System.out.println(a.str)
a.print()
}
Java 코드
package com.b1
import com.a1; >
/** * testA2는 com.b1에 속합니다 * * @author Will * */ public class testA2 { public static void main(String[] args) { // testA2와 A는 같은 패키지에 속하지 않기 때문에 친숙한 멤버에 접근할 수 없습니다 // 주석을 제거하면 오류가 발생합니다 A a = new A( ); ; 클래스 파일은 서로의 친숙한 멤버를 호출할 수 있습니다. 그 이유는 패키지를 지정하지 않으면 기본적으로 모든 파일이 기본 패키지에 속하므로 서로의 친숙한 멤버를 호출할 수 있기 때문입니다. 다음으로 protected 유형을 살펴보겠습니다. 이 유형은 친숙한(즉, 기본) 유형과 매우 유사하며 유일한 차이점은 상속입니다. 간단히 말해서, 클래스 파일이 동일한 패키지(상속 포함)에 속하지 않는 한 다른 클래스 파일은 친숙한 멤버에 액세스할 수 없지만 클래스가 상속되면 동일한 패키지에 속하는지 여부에 관계없이 상속의 경우 하위 클래스는 상위 클래스의 보호된 멤버에 액세스할 수 있습니다.Java 코드
패키지 com.a1;
/**
* A는 com.a1 패키지에 속합니다
* i, str은 친숙한 유형
* j, str1은 보호 유형
* @author
*
*/
공개 클래스 A {
int i;
문자열 str;
protected int j
protected String str1;
공개 A(){
}
}
void print(){
System.out.println("i:"+ i+ ";str:"+str);
}
protected void print(int k){
System.out.println(" j :"+j+";str1:"+str1);
패키지 com.a1;
/**
* testA1은 com.a1에 속합니다
* @author Will
공개 클래스 testA1 {
public static void main(String[] args ) {
// testA1과 A가 동일한 패키지에 속하므로 친숙한 멤버에 액세스할 수 있습니다.
// 또한 보호된 멤버에 액세스
A a= new A()
System.out.println(a.i)
System.out.println(a.str); ;
System.out.println(a.str1);
a.print()
}
}
Java 코드
package com.b1;
import org.junit.Test;
import com.a1.A;
공용 클래스 ExtendsA 확장 A{ > @Test
Public void test () {
Extendsa Extendsa = New Extendsa ()
// 상속의 경우 상위 클래스의 친숙한 멤버를 호출할 수 없습니다. //댓글을 삭제하면 오류가 발생합니다. //System.out.println(extendsA.i) // System.out.println(extendsA. str); 호출 가능한 상위 클래스 보호 멤버 System.out.println(extendsA.j) System.out.println(extendsA .str1); 확장A. 인쇄(1); } }