java/inheritance

[inheritance] 10. 접근제한자 (private, public, protected, package(default))

jeri 2024. 4. 25. 11:56
반응형

1. 접근제한자(접근지정자)의 종류

  • 🔐클래스 ,🔐필드 , 🔐메소드에 대한 접근 유무를 설정하기 위한 제한자
  • 외부에서 접근할 수 있는 레벨
  • 접근 키워드(keyword)

 

 

 

 

2. priavte - 같은 클래스 내 접근 가능

  • 필드 와 메소드에 사용 가능한 접근제한자 - 은닉화
  • 클래스는 사용 불가능
  • 클래스 내부에서만 접근 가능하며 클래스 외부에서는 접근 불가능

1) 클래스 내 : 접근ok

package xyz.itwill.access;

//public클래스
public class PrivateMember {

	//private필드
	private int num;

	//private메소드
	private void display() {	
		System.out.println("num = "+num); //동일클래스는 private필드 사용가능
	}

}

 

2) 외부 클래스 : 접근error

package xyz.itwill.access;

public class PrivateMemberUse {
	public void run() {	
		PrivateMember member=new PrivateMember();//객체생성ok - public이기때문	
		//member.num=100;//error - private이기때문 
		//member.display();//error -private이기때문
	}
}

 

 

 

 

 

 

 

 

3. public - 무제한 접근 가능

  • 클래스 ,필드 , 메소드에 사용 가능한 접근제한자
  • 모든 패키지의 클래스에서 접근 가능하도록 설정

1) public 클래스

  • 다른 패키지에 클래스에서 접근할 수 있도록 작성된 클래스
  • public 클래스가 아닌 경우 다른 패키지의 클래스에서 접근 불가능 - 에러 발생
  • 소스파일에 public 클래스는 하나만 작성 가능
  • 소스파일에는 클래스 하나만 작성 권장
//클래스A.java - ok
public class 클래스A{}

//클래스A.java - ok(권장)
class 클래스A{}

//클래스A.java - ok(비권장)
public class 클래스A{}
class 클래스B{}

//클래스A.java or 클래스B.java - ok (비권장)
class 클래스A{}
class 클래스B{}

//error
public class 클래스A{}
public class 클래스B{}

2) 클래스내 : 접근ok

package xyz.itwill.access;

//public클래스
public class PublicMember {
	//public필드
	public int num;

	//public메소드
	public void display() {
		System.out.println("num = "+num);
	}

}

 

3) 동일패키지 : 접근ok

package xyz.itwill.access;
public class PublicMemberUse {
	public void run() {
		PublicMember member=new PublicMember();
		member.num=100;
		member.display();
	}

}

 

4) 다른패키지 : 접근ok

package xyz.itwill.other;
import xyz.itwill.access.PublicMember;

public class PublicMemberOtherUse {
	public void run() {		
		PublicMember member=new PublicMember();//다른 패키지의 클래스를 사용하기 위한 import 처리
		member.num=100;
		member.display();
	}
}

 

 

 

 

 

 

 

4. protected - 같은패키지 및 자식클래스만 접근 가능

  • 필드 , 메소드에 사용 가능한 접근제한자
  • 같은 패키지의 클래스에서 접근 가능하도록 설정
  • 다른 패키지의 클래스에서 접근할 경우 에러 발생되지만, 상속을 사용하면 접근 가능

1) 클래스내 : 접근ok

package xyz.itwill.access;

//public클래스
public class ProtectedMember {
	//protected필드
	protected int num;
	//protected메소드
	protected void display() {
		System.out.println("num = "+num);
	}

}

 

2) 동일패키지 : 접근ok

package xyz.itwill.access;
public class ProtectedMemberUse {
	public void run() {
  		//객체생성ok - public이기때문
		ProtectedMember member=new ProtectedMember();
		member.num=100;  //ok
		member.display();  //ok
	}
}

3) 다른패키지 : 접근error

package xyz.itwill.other;
import xyz.itwill.access.ProtectedMember;

public class ProtectedMemberOtherUse {
	public void run() {
  		//객체생성ok - public이기때문
		ProtectedMember member=new ProtectedMember();
		//member.num=100;  //error
		//member.display();  //error
	}
}

 

4) 다른패키지 + 자식클래스 : 접근ok

package xyz.itwill.other;
import xyz.itwill.access.ProtectedMember;

public class ProtectedMemberOtherInheritanceUse extends ProtectedMember {
	public void run() {
		//객체생성ok - public이기때문
		ProtectedMember member=new ProtectedMember();
		//protected 접근제한자로 설정된 부모클래스의 필드 또는 메소드에 접근 가능
		num=100;  //ok
		display();  //ok
	}
}

 

 

 

 

 

 

 

5. package(default) - 같은 패키지끼리만 접근 가능

  • 클래스 , 필드 , 메소드 에 사용 가능한 접근제한자
  • 클래스 , 필드 , 메소드 작성시 접근제한자 관련 키워드를 사용하지 않으면 package 접근제한자로 설정됨
  • 같은 패키지의 클래스에서 접근 가능하도록 설정
  • 다른 패키지의 클래스에서 접근할 경우 무조건 에러 발생

1) 클래스내 : 접근ok

package xyz.itwill.access;

//public클래스
public class PackageMember {
	//package필드
	int num;
	//package메소드
	void display() {
		System.out.println("num = "+num);
	}
}

 

2) 동일패키지 : 접근ok

package xyz.itwill.access;

public class PackageMemberUse {
	public void run() {
  		//객체생성ok - public이기때문
		PackageMember member=new PackageMember();
		member.num=100;  //ok
		member.display();  //ok
	}
}

 

3) 다른패키지 : 접근error

package xyz.itwill.other;
import xyz.itwill.access.PackageMember;

public class PackageMemberOtherUse {
	public void run() {
		//객체생성ok - public이기때문
		@SuppressWarnings("unused")
		PackageMember member=new PackageMember();
		//member.num=100; //error
		//member.display(); //error
	}
}

4) 다른패키지 + 자식클래스여도 : 접근error

package xyz.itwill.other;
import xyz.itwill.access.PackageMember;

public class PackageMemberOtherInheritanceUse extends PackageMember {
	public void run() {
		//객체생성ok - public이기때문
		PackageMember member=new PackageMember();
		//num=100; //error
		//display(); //error
	}
}

 

반응형