리얼라이져의 마케팅, 개발, 창업 블로그

Public, Protected,Private, default 차이점 본문

IT/자바

Public, Protected,Private, default 차이점

nadadhl 2019. 4. 11. 15:23
728x90

가끔 개발을 하다보면,  클래스, 변수 ,메소드 앞에   public, protected ,private  들이

붙어 있는 것을 볼때가 있습니다.

 

이들은  '접근제어자'(access modifier) 라고 불리는데요. 

 

어떻게  사용하는지  알아보겠습니다.

 

우선  해당 자료를 검색해보면,  쉽게 접할수 있는  '접근제어자 별  접근범위'를 정리해둔  표입니다.

 

(접근 가능 o,   접근 불가 x)

    default(없음) private protected public
   동일     패키지 접근

   같은     클래스  접근 O O O O
   상속     클래스 접근 O X O O
    다른     클래스  접근 O X O O

   다른     패키지 접근

   일반      클래스    접근 X X X O
   상속     클래스   접근 X X O O

 

솔직히,  저는 위표만 보고는 감이 오지 않았습니다. ㅠㅠ

 

그래서 직접 코드로 확인해보았습니다.

(모든 확인 방법은  변수를 가지고  확인하였습니다.)

 

 

 

 

먼저, 같은 패키지 같은 클래스에서 접근할때 입니다.

 

우선,  각 접근제한자를  이용하여  jjj package -> 접근제어자 class안에  변수들을 선언하고,

해당 class 안에 메인메소드를  두어 변수들을  출력해보겠습니다.

 

(변수명은 알아보기 쉽고 직관적이게  한글로....)

 

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
package jjj;
 
public class 접근제어자 {
    
  private static  String private접근="private 입니다.";
 
  public  static String public접근="public 입니다.";
 
  protected static String protected접근="protected 입니다.";
 
  static String default접근="default 입니다"
    
  
  public static void main(String[] args) {
      
 
      System.out.println(private접근);
 
      System.out.println(public접근);
 
      System.out.println(protected접근);
 
      System.out.println(default접근);
 
   }
  
}
cs

 

   결과는  아래와 같이  나옵니다.

   모두  출력이 되는것을 보니까 같은 클래스안에서는 

   모든 접근 제한자가  접근이  허용 이 된다를  눈으로  볼수 있습니다.

 

 

 

 

 

 

 

 

 

다음은  같은 패키지  상속 클래스 에서 접근하려 할때입니다.

 

jjj패키지에서  접근제어자 class에 각  접근제어자를 이용한 변수 선언을 해놓고, 

같은 jjj패키지  접근제어자하위클래스 class에서  접근제어자 class를 상속한뒤,

접근제저아 class 변수들을  사용해보겠습니다.

 

sdfssdf
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
31
32
33
34
35
36
37
38
39
package jjj;
 
public class 접근제어자 {
    
  private String private접근="private 입니다.";
  
  public  String public접근="public 입니다.";
  
  protected  String protected접근="protected 입니다.";
  
  String default접근="default 입니다"
 
}
 
 
 
 
//아래는  위 접근제어자의 상속 클래스
 
package jjj;
 
public class 접근제어자하위클래스 extends 접근제어자 {
 
    
    public static void main(String[] args) {
        
          접근제어자하위클래스 상속클래스=new 접근제어자하위클래스();
 
          System.out.println(상속클래스.public접근);
 
          System.out.println(상속클래스.protected접근);
 
          System.out.println(상속클래스.default접근);
        
            
    }
    
}
 
cs

 

위  코드를 보면,  부모 class에서

public,protected,default 변수들은  접근하여  받아왔지만, private는 보이지 않습니다.

 

위  사진과 같이  실제로  private 변수는  상속클래스에서 사용할수 있는 목록에 뜨지 않습니다.

 

 

이걸로 같은 패키지  상속 클래스에서는  부모 class의  private은 접근  불가능하고, 

나머지  접근제어자는 접근이 가능하다는것을 알수 있었습니다.

 

 

 

 

 

 

 

 

 

 

다음은  같은 패키지 다른  클래스에서  접근 하려 할때입니다.

 

jjj 패키지 안에 접근제어자 class  그리고 접근제어자다른클래스 class를 만들어서

진행해보겠습니다.

 

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
31
32
33
34
35
36
package jjj;
 
public class 접근제어자 {
    
  private String private접근="private 입니다.";
  
  public  String public접근="public 입니다.";
  
  protected  String protected접근="protected 입니다.";
  
  String default접근="default 입니다"
 
}
 
 
 
//아래는  그냥 같은 패키지 안에 있는 다른 
 
package jjj;
 
public class 접근제어자다른클래스 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
 
        접근제어자 sd=new 접근제어자();
    
        System.out.println(sd.default접근);
        System.out.println(sd.protected접근);
        System.out.println(sd.public접근);
        
 
    }
 
}
 
cs

위의  코드를 보면, 상속 클래스 처럼  private을 뺀  나머지 접근제어자들이  보입니다

 

이번 경우도 상속 클래스때와 마찬가지로,

private을 제외한  접근제한자들은  같은 패키지 내에서 다른 클래스에서의  접근이 가능했습니다.

 

 

 

 

 

 

 

 

 

다음은   다른 패키지에 있는   클래스에서   접근   하려 할때입니다.

 

kkk패키지 안에  '접근제어자다른패키지클래스 class' 를 만들고,   

기존의  접근제한자 를   이용하여  변수를 선언한   'jjj 패키지의    접근제어자 class' 를   import 합니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package kkk;//현재 패키지
 
import jjj.접근제어자;//jjj 패키지 가져옴.
 
public class 접근제어자다른패키지클래스 {
 
    public static void main(String[] args) {
        
        
     접근제어자 접근제어자=new 접근제어자();
     
     System.out.println(접근제어자.public접근);
        
                
        
    }
    
}
cs

 

 

 

위의  코드와 사진을  보면 눈치채 시겠지만, public만  가지고 올수 있었습니다.

여기서  알수 있는 사실은  다른 패키지로 가져올수 있게 하는 접근제어자는 public 뿐이다   입니다.

 

 

 

 

이제  마지막으로,  다른패키지에서  접근제어자를 이용한 변수가 선언된 클래스를  상속한 클래스의 경우입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package kkk;//현재 패키지
 
import jjj.접근제어자;//jjj 패키지 가져옴.
 
public class 접근제어자다른패키지클래스 extends 접근제어자 {
 
    public static void main(String[] args) {
        
        
        접근제어자다른패키지클래스 접근제어자다른패키지클래스=new 접근제어자다른패키지클래스();
        
        System.out.println(접근제어자다른패키지클래스.protected접근);
        System.out.println(접근제어자다른패키지클래스.public접근);
        
        
    }
    
}
cs

 

 

 

 

 

이렇게  위 사진과   코드를  보면, 

다른패키지에서  기존 클래스를  상속 한  클래스는 protected와 public을 사용한  변수들에는  접근 할수 있는 것을  볼수 있습니다.

 

 

 

 

 

이상  맨 위  표를 토대로  접근제어자('access modifier')별   접근  허용 범위를   코드로   확인해 보았습니다.

 

이상  끝~

 

 

 

개발자가 되기 위해  공부 중인  비전공자  학생입니다. 
아직 부족하여,  부족하거나  틀린 내용이 있을수 있으니, 
그부분에 대해서  생각을  댓글로 공유해주시면 

감사하겠습니다.^^

 

'IT > 자바' 카테고리의 다른 글

자바 nextInt() 다음에 nextLine() 실행 안되는 현상  (0) 2020.02.02
Comments