본문 바로가기
study/JAVA

접근 제한자( Access Modifier)

by Elfen Lied 2022. 2. 18.
반응형
  • 다른 패키지에서 클래스를 사용 못하게 막음 (클래스 제한)
  • 클래스로부터 객체를 생성하지 못하게 막음 (생성자 제한)
  • 특정 필드와 메서드를 숨김 처리함 (필드와 메서드 제한)

 

- 접근 제한자 종류

순서대로 접근 제한이 강화된다.

접근 제한 적용 대상 접근할 수 없는 클래스
public 클래스, 필드, 생성자, 메소드 없음
protected            필드, 생성자, 메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스
default 클래스, 필드, 생성자, 메소드 다른 패키지에 소속된 클래스
private            필드, 생성자, 메소드 모든 외부 클래스

default는 아무것도 안 붙이는 것을 뜻함.

 


- 실습

--  1. 생성자 접근 제한

 

  1.  패키지를 두개 만든다. (package1, package2)
  2.  package1 안에 클래스 두 개 만든다. (A, B)
  3.  package2 안에 클래스 하나 만든다. (C)

 

1. A 클래스에 메서드 3개를 만들고, 각각 new를 써서 필드를 선언해본다.

public class A {
	A a1 = new A(true);
	A a2 = new A();
	A a3 = new A("문자열");
	
	public A(boolean b) {}
	A(){}
	private A(String s) {}
}

 

컴파일 오류 없이 잘 선언된다.

 

 

2. 이번에는 같은 패키지에 있는 B 클래스에 필드를 선언해본다.

public class B {
	A a1 = new A(true);
	A a2 = new A();
	A a3 = new A("문자열");
}

a1의 public는 어디서든 사용 가능하다.

a2의 default는 같은 패키지에 있기 때문에 사용 가능하다.

a3의 private는 컴파일 오류가 생긴다.

private는 자신이 있는 A 클래스 안에서만 사용 가능하다. (외부 X)

 

 

3. package2에 있는 C 클래스에 필드를 선언해본다.

public class C {
	A a1 = new A(true);
	A a2 = new A();
	A a3 = new A("문자열");
}

a2와 a3에 컴파일 오류가 날것이다.

a2의 dafault는 패키지가 다르면 사용 불가.

a3의 private는 자신이 있는 A 클래스 안에서만 사용 가능하다. (외부 X)


-- 2. 필드 접근 제한

 

  1.  패키지를 두 개 만든다. (package1, package2)
  2.  package1 안에 클래스 두개 만든다. (A, B)
  3.  package2 안에 클래스 하나 만든다. (C)

 

1. A 클래스에 필드 3개와 메서드 3개를 선언한다.

public class A {
	public int field1;
	int field2;
	private int field3;

	public void method1() {}
	void method2() {}
	private void method3() {}
	
}

 

2. 생성자를 하나 만들어 주고 필드와 메서드를 작성해본다.

public class A {
	public int field1;
	int field2;
	private int field3;
	
	public A() {
		field1 = 1;
		field2 = 1;
		field3 = 1;
		
		method1();
		method2();
		method3();
	}
	
	public void method1() {}
	void method2() {}
	private void method3() {}
	
}

아무 문제없이 잘 된다.

 

 

2. B 클래스에 생성자 B를 만들고 필드와 메서드를 입력해본다.

public class B {
	public B() {
		field1 = 1;
		field2 = 1;
		field3 = 1;
		
		method1();
		method2();
		method3();
	}
}

이렇게 하면 컴파일 오류가 날것이다.

현재 B클래스에서 사용하려는 필드와 메서드는 A 클래스에 있기 때문이다

 

 

다시 A 객체를 생성해보자.

A 객체를 만들고 a로 참조 변수를 사용해야 한다.

public class B {
	public B() {
		A a = new A();
        
		a.field1 = 1;
		a.field2 = 1;
		a.field3 = 1;
		
		a.method1();
		a.method2();
		a.method3();
	}
}

field3과 method3은 private라서 사용할 수 없기에 오류가 날것이다.

default인 field 2와 method2는 같은 패키지이기 때문에 사용 가능함.

 

 

3. C 클래스에 생성자 C를 만들고 다 붙여 넣어보자.

public class C {
	public C() {
		A a = new A();
		a.field1 = 1;
		a.field2 = 1;
		a.field3 = 1;
		
		a.method1();
		a.method2();
		a.method3();
	}
}

패키지가 다르기 때문에 default와 private인 field2, field3은 컴파일 오류가 뜰 것이다.

 

반응형

'study > JAVA' 카테고리의 다른 글

어노테이션(Annotation)  (0) 2022.02.22
Getter와 Setter  (0) 2022.02.18
상수(static final)  (0) 2022.02.14
final 필드  (0) 2022.02.14
싱글톤(Singleton) 생성과 얻는법  (0) 2022.02.14

댓글