코딩이란 무엇일까

Java/자바[10]일차(1)-접근 제한자 본문

국비지원수업

Java/자바[10]일차(1)-접근 제한자

둥구는 지굴다 2022. 11. 2. 21:26

접근 제한자

접근 제한자는 이름에서 알 수 있듯이 접근을 제한하기 위해서 사용합니다.

여기서 접근이란 클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버들에게 접근하는 것을 제한합니다.

접근 제한자의 종류

  • public : 모든 클래스에서 접근이 가능합니다. 가장 범위가 넓습니다.
  • portected : 동일 패키지에 속한 클래스 및 서브 클래스의 접근을 허용합니다.
  • default : 동일 패키지에 속한 클래스에서만 접근을 허용합니다. default는 기본 값으로 제한자를 쓰지 않았을 경우 default 접근 제한자가 됩니다.
  • private : 현재 클래스에서만 접근이 가능합니다. 접근 가능한 범위가 가장 좁습니다.
접근자 클래스 내부 동일 패키지  상속받은 클래스 이 외의 영역
private O X X X
default O O X X
protected O O O X
public O O O O

접근 제한자 사용해보기

클래스 영역

public class MyClass1 {
	
	//인스턴스 필드
	private int age; //private접근 제한자 : 현재 포함되어있는 MyClass1에서만 사용가능 
	String name; // default 접근제한자 
	public double point; //public 접근 제한자 : 모든 클래스에서 사용 가능
	
	//static필드
	static int etc; //default 접근 제한자 이면서 , static
	public static final String msg="myclass1"; //심볼릭 symbolic상수 
	
	public String fielids() {
		return "나이 :"+age+",이름"+name+",포인트 :"+point;
	}

메인 메서드에서 접근해보기

메인 메서드

public class C51MyclassTest {

	public static void main(String[] args) {
		//인스턴스 필드는 객체를 생성하고 데이터를 저장
		MyClass1 my1= new MyClass1();
		System.out.println("객체 생성 후 필드 값:"+my1.fielids());
		
		//my1.age=12;  오류: age변수는 private이기 때문에 접근 불가
		my1.name="모모";
		my1.point=12.3;
		MyClass1.etc=123; // static변수여서 클래스명. 으로 접근가능
		//MyClass1.msg="테스트"; 오류: final상수이므로 값 변경 불가
		System.out.println("객체 생성 후 필드 값 저장:"+my1.fielids());
		System.out.println("static 필드 확인");
		System.out.println(MyClass1.etc); //결과 123
		System.out.println(MyClass1.msg); //결과 
		
	}

위의 코드를 보시면서 중요하게 봐야 할 점은 주석처리로 잘 안보일 수도 있지만 my1 인스턴스를 통해서 age에 접근하여 값을 넣으려 했지만 오류가 났습니다. 

그 이유는 ageprivate이 있는 변수이기 때문입니다.

MyClass1 필드가 선언된 클래스를 제외하고는 다른 곳에서는 접근을 할 수 없습니다.

msg라는 변수는 클래스에서 선언될 때 보면 알겠지만 

public static final String msg="myclass1"

static final이라고 선언이 돼있습니다.

따라서 final은 상수를 뜻하며 static은 클래스 변수이므로 객체마다 값이 바뀌는 것이 아닌 클래스에 존재하는 상수이기 때문에 선언과 동시에 값을 초기화해주어야 하는 클래스 상수입니다

출력 결과

다른 패키지에서도 접근해보기

접근 제한자중 public을 제외한 나머지 접근 제한자들은 다른 패키지에서의 접근이 제한됩니다.

이 부분을 확인해 보기 위해서 다른 패키지를 생성 후 MyClass1을 import 하여 코드를 작성해보겠습니다.

⚠️다른 패키지의 클래스는 import가 필요합니다⚠️
import test1.MyClass1;

public class C51MyclassTest {

	public static void main(String[] args) {
		//인스턴스 필드는 객체를 생성하고 데이터를 저장
		MyClass1 my1= new MyClass1(); //**다른 패키지의 클래스는 import필요**
		System.out.println("객체 생성 후 필드 값:"+my1.fielids());
		//my1.age=12;  오류: age변수는 private이기 때문에 접근 불가
		//my1.name="모모"; 오류:default 접근 제한자 이기 때문에 다른 패키지에서 접근 불가.
		my1.point=12.3;
		//MyClass1.etc=123; 오류:static변수여서 클래스명. 으로 접근가능
		//MyClass1.msg="테스트"; 오류: final상수이므로 값 변경 불가
		System.out.println("객체 생성 후 필드 값 저장:"+my1.fielids());
		System.out.println("static 필드 확인");
		System.out.println(MyClass1.etc);
		System.out.println(MyClass1.msg);
		
	}

위에서 설명한 대로 static을 붙인 클래스 변수와 public접근 제한자를 사용한 point변수를 제외한 나머지는 다른 패키지에서는 접근이 안 되는 것을 확인할 수 있습니다.

출력 결과

 


이상으로 글 마치겠습니다.

글 읽어주셔서 감사합니다.

 

Comments