Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

RussellHouse

[Java] 22. Access Controler 본문

Java

[Java] 22. Access Controler

러셀가의 집사 2017. 12. 23. 14:22

Access Controler








접근 제어자는 클래스의 멤버(변수와 메소드)들의 접근 권한을 직접적으로 지정해준다.



자세한 것은 아래 사항을 보자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package org.opentutorials.javatutorials.accessmodifier;
class A {
public String y(){
return "public void y()";
}
private String z(){
return "public void z()";
}
public String x(){
return z();
}
}
public class AccessDemo1 {
public static void main(String[] args) {
A a = new A();
System.out.println(a.y());
// 아래 코드는 오류가 발생한다.
//System.out.println(a.z());
System.out.println(a.x());
}
}



메소드 z는 키워드 private로 시작하고 있다.


이러한 private은 해당 클래스 밖에서는 접근 할 수 없다는 것을 의미한다.


바로 이 private 자리에 오는 것들을 '접근 제어자' 라고 한다.



그럼 사용할 수 없는 메소드를 왜 정의하는 것일까?


=> 내부적으로 사용하기 위해서 이다.



하지만,


1
System.out.println(a.x());


을 실행할 경우,


1
2
3
public String x(){
return z();
}




이기 때문에 정상적으로 호출된다.


즉 메소드의 내용을 보면 내부적으로 메소드 z를 호출하고 있다.


왜냐하면 메소드 x와 메소드 z는 같은 클래스의 소속이기 때문이다.





즉, private와 같은 접근 제어자로 규정을 해놓더라도, 해당 클래스 내의 또다른 메소드를 정의해 놓음으로써,


접근이 가능하게 한 것이다.






접근 제어자를 쓰는 이유는,



첫째, 무분별한 접근을 방지함으로써, 개발자가 의도하지 못한 오동작을 일으키지 않게 하기 위함이다.



둘째, 사용자에게 객체를 조작 할 수 있는 수단만을 제공함으로써 결과적으로 객체의 사용에


집중할 수 있도록 돕기 위함이다.






다음은 보다 진보된 형태의 계산기 예제이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package org.opentutorials.javatutorials.accessmodifier;
class Calculator{
private int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
private int _sum(){
return this.left+this.right;
}
public void sumDecoPlus(){
System.out.println("++++"+_sum()+"++++");
}
public void sumDecoMinus(){
System.out.println("----"+_sum()+"----");
}
}
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 20);
c1.sumDecoPlus();
c1.sumDecoMinus();
}
}





우선, 인스턴스 필드인 left와 right가 private로 설정되었다.



이는 위의 변수들이 객체 외부에서 호출될 필요가 없기 때문이다.



따라서 외부로부터 이 변수를 숨기기 위해서 접근 제어자로 private을 지정했다.




또한 private 메소드인 _sum이 추가 되었는데,


실제 계산은 _sum이 내부적으로 담당하고,


계산된 결과를 외부해 출력해주는 sumDecoPlus와 sumDecoMinus를 정의해줌으로써,


_sum이라는 메소드는 호출될 필요가 없으며, 이를 숨기기 위해 private 메소드로 지정했다.



이와 같은 조치들을 통해서 사용자가 접근하면 안되거나 접근 할 필요가 없는


멤버에 대한 접근을 규제할 수 있게 되었다.




안타깝게도, 이러한 public과 private외에도 접근제어자에는 protected와 default가 존재한다.


protected는 상속 관계에 있다면, 서로 다른 패키지에 있는 클래스의 접근도 허용한다.


default는 접근 제어 지시자가 없는 경우를 의미하는데,


접근 제어자가 없는 메소드는 


같은 패키지에 있고 상속 관계에 있는 메소드에 대해서만 접근을 허용한다.



즉,  pulbic protected default private 로 갈수록 점차적으로 허용 권한이 작아진다.




다음은 각 접근 제어자들에 대한 세부 정보이다.


 

 publicprotecteddefaultprivate
같은 패키지, 같은 클래스허용허용허용허용
같은 패키지, 상속 관계허용허용허용불용
같은 패키지, 상속 관계 아님허용허용허용불용
다른 패키지, 상속 관계허용허용불용불용
다른 패키지, 상속 관계 아님허용불용불용불용





지금까지는 클래스 멤버에 대한 접근 제어자들에 대하여 알아보았다.



다음으로는 클래스의 접근 제어자에 대하여 알아보자.



클래스의 접근 제어자로는 public과 default만이 있다.


별다른 접근 제어자가 수식하지 않는 경우에는, 자동적으로 default 처리가 되어있다고 생각하면 된다.



클래스 접근 제어자는 패키지와 관련된 개념이다.



즉 접근 제어자가 public인 클래스는 다른 패키지의 클래스에서도 사용될 수 있는 반면,


default인 경우는 같은 패키지에서만 사용이 가능하다.




아래의 예시를 보자.


예시와 같이 2개의 클래스를 정의하였다고 가정해보자.



1
2
package org.opentutorials.javatutorials.accessmodifier.inner;
public class PublicClass {}

1
2
package org.opentutorials.javatutorials.accessmodifier.inner;
class DefaultClass {}


같은 패키지에서 위 2개의 패키지들을 사용해보자.



1
2
3
4
5
package org.opentutorials.javatutorials.accessmodifier.inner;
public class ClassAccessModifierInnerPackage {
PublicClass publicClass = new PublicClass();
DefaultClass defaultClass = new DefaultClass();
}



문제 없이 잘 작동된다.



이번에는 다른 패키지의 클래스에서 사용해보자.



1
2
3
4
5
6
package org.opentutorials.javatutorials.accessmodifier.outter;
import org.opentutorials.javatutorials.accessmodifier.inner.*;
public class ClassAccessModifierOuterPackage {
PublicClass publicClass = new PublicClass();
//DefaultClass defaultClass = new DefaultClass();
}




주석으로 처리한 부분에 오류가 발생하는데,



이는 DefaultClass의 접근 제어자가 default이기 때문이다.



한가지 중요한 사항은, public class의 이름과 source코드의 파일 명이 일치해야한다는 것이다.



아래 코드의 이름은 PublicNameDemo.java이다.




1
2
3
package org.opentutorials.javatutorials.accessmodifier.inner;
//public class PublicName {}
public class PublicNameDemo {}




주석 표시 된 곳의 경우, 퍼블릭 클래스의 이름과 소스코드의 파일명이 일치하지 않기 때문에


에러가 발생한다.




즉, 하나의 소스 코드에는 하나의 public 클래스만이 존재할 수 있다는 것을 의미한다.

'Java' 카테고리의 다른 글

[Java] 24. Final  (0) 2017.12.23
[Java] 23. Abstract  (0) 2017.12.23
[Java] 21. API&API document  (0) 2017.12.23
[Java] 20. Package  (0) 2017.12.22
[Java] 19. Classpath  (0) 2017.12.22
Comments