본문으로 바로가기

자바 - 접근제어자

category 코딩/Java 2016. 9. 12. 09:00





접근제어자란?


멤버 또는 클래스에 사용되어, 해당하는 맴버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.


- 접근제어자를 사용할 수 있는곳 : 클래스, 멤버변수, 메서드, 생성자



<종류/범위>


  • provate : 같은 클래스 내에서만 접근 가능

  • deafult : 같은 패키지 내에서만 접근 가능, 접근제어자를 지정하지 않았다면 자동으로 deafult로 지정된다.

  • protexted : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.

  • public : 접근 제한이 전혀 없다.



접근 제어자는 대상에 따라 사용가능할 수 있는것이 다르다.





접근 제어자를 사용하는 이유


접근 제어자는 접근할 수 있는 범위를 제한한다. 이걸 사용하는 이유는 외부의 접근으로 부터 데이터를 보호하거나, 굳이 보여줄 필요가 없는 정보나 내부적으로만 사용되는 정보를 감추기 위해서이다.



1. provate : 같은 클래스에서만 접근 가능


[예제 1]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class AccessTest01 
{
    public static void main (String[] args)
    {
        Access01 ac = new Access01();
        System.out.println(ac.a);
        System.out.println(ac.b);
    }
}
 
 
class Access01
{
    int a = 200;
    private int b = 100;
    
}
cs


[실행결과]



위의 예제를 실행하면 에러가 난다. Access01 클래스의 변수 b에 접근하려 하지만 b에는 private 가 사용되어 있다.


private 는 같은 클래스에서만 사용가능하므로 Access01 내에서만 사용가능 하다. 즉 Access01 외부의 클래스에서 사용하려고 하면 에러가 발생한다.



2. default : 같은 패키지에서만 접근가능


[예제 2]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package T01; // T01 이라는 같은 패키지
 
public class AccessTest01 
{
    public static void main (String[] args)
    {
        Access01 ac = new Access01();
        System.out.println(ac.a);
        System.out.println(ac.b);
    }
}
 
 
class Access01
{
    int a = 200;
    int b = 100;
    
}
cs


[실행결과]




예제에서 Access01 클래스의 변수 a, b에 따로 접근 제어자를 지정하지 않았다. 접근 제어자를 지정하지 않는다면 자동으로 default 가 적용된다. default 는 같은 패키지에서만 접근 가능하다. 


위의 AccessTest01 클래스와 Access01 클래스는 모두 T01 이라는 패키지에 들어있다. 둘다 같은 패키지에 있으므로 Access01 의 변수에 모두 접근 가능하다.



[예제 3]



[실행결과]



또 다른 예제를 보자. AccessTest01 과 AccessTest02 는 T01 이라는 패키지에 속해있다. AccessTest01 에서 AccessTest02의 변수 c, d에 모두 접근 가능하다. 이는 default 로 접근제어자가 사용되어 있기 때문이다.


만약 AccessTest01 과 AccessTest02 가 서로 다른 패키지였을 경우 예제 실행시 에러가 발생한다.



3. protected : 같은 패키지나 상속 받을 경우 접근가능


[패키지 구조]



[예제 4]


1
2
3
4
5
6
7
8
9
10
package T01;
 
class TV
{
    public static void main (String[] args)
    {
        Computer com = new Computer();
        System.out.println("컴퓨터의 가격 : " + com.price);
    }
}
cs


1
2
3
4
5
6
package T01;
 
class Computer 
{
    protected int price = 1000;
}
cs


[실행결과]



TV 클래스와 Computer 클래스는 모두 T01 이라는 패키지에 들어 있다. TV 클래스에서 Computer 클래스의 변수 price를 호출하면 문제없이 호출이 된다. protected 는 같은 패키지 내에서라면 접근이 가능하다.


그럼 다른 패키지에 있는 Product 클래스의 변수를 호출해 보자.


[예제 5]


1
2
3
4
5
6
7
8
9
10
11
12
package T01;
 
import T02.Product;
 
class TV
{
    public static void main (String[] args)
    {
        Product p = new Product();
        System.out.println("제품 전원 상태 : " + p.power);
    }
}
cs


1
2
3
4
5
6
package T02;
 
public class Product 
{
    protected String power = "off";
}
cs


[실행결과]



서로 다른 패키지에 있는 경우 protected 가 사용되면 접근할 수 없다. 패키지 T01에 있는 TV 클래스에서 패키지 T02에 있는 Product 클래스의 변수 power에 접근하려 하자 에러가 발생한다.


다른 패키지에 있을 경우 상속을 받으면  protected되 변수에 접근 가능하다.



4. public : 접근에 제한이 없음


[예제 6]


1
2
3
4
5
6
7
8
9
10
11
12
package T01;
 
import T02.Product;
 
class TV
{
    public static void main (String[] args)
    {
        Product p = new Product();
        System.out.println("제품 전원 상태 : " + p.power);
    }
}
cs


1
2
3
4
5
6
package T02;
 
public class Product 
{
    public String power = "off";
}
cs


[실행결과]



TV와 Product 클래스는 서로 다른 패키지에 있다. TV클래스에서 Product 클래스의 변수 power을 호출할 경우 정상적으로 호출된다. power 변수앞에 사용된 접근 제어자 public는 접근제한이 없으므로 다른 클래스, 다른 패키지라도 접근이 가능하다.



'코딩 > Java' 카테고리의 다른 글

오버라이딩(Overriding)  (0) 2016.09.20
자바 - 상속  (0) 2016.09.13
객체지향 3부 - 오버로딩, 생성자  (0) 2016.09.11
객체지향 2부 - 변수, 메서드  (0) 2016.09.10
객체지향 1부 - 특징, 클래스와 객체  (0) 2016.09.07
RSS구독 링크추가 트위터 이메일 구독