Java/Theory

[Java/Theory]12. Access Modifier

양승길 2016. 5. 30. 19:40

12. Access Modifier    

    public      : 자신 / 동일 Package / 상속 관계 / 그 외 영역 접근 가능

    peotected : 자신 / 동일 Package / 상속 관계 /               접근 가능

    default     : 자신 / 동일 Package /              /               접근 가능

    private     : 자신 /                   /              /               접근 가능

    => public, private만 주로 사용됨


    * Field를 private로 정보 은닉하여 Getter, Setter를 사용한 것 처럼,

      class자체의 정보 은닉을 위해

      class의 생성자를 private로 선언한다면 외부 class (타 class)에서 Instance 생성이 불가능하게 둘 수 있다.

      getInstatnce()라는 Method로 Getter를 생성하여 정보 은닉을 활용 할 수 있도록 한다.

      이 Method를 static으로 선언하고 외부 Class에서 사용하도록 한다.

      Argument를 추가하여 조건부 Instance 생성을 하도록 한다.

      (물론 다른 생성자에 다른 접근자로 둔다면 얘기가 달라질 수 있다.)

      

      Ex 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TopSecret04{
    private TopSecret04(){
    } // end of constructor
 
    public TopSecret04(int a){
        a = 1;
    } // end of constructor
 
    public static TopSecret04 getInstance(int managerNo){
        if(managerNo == 1234){
            return new TopSecret04();
        }else{
            return null;
        }
    } // end of getInstance
// end of class
cs

      -> static : class로 생성된 Instance들이 모두 공유하는 속성과 행위.

                  객체는 서로 다른 상태를 가진다는 특징이 있다 할지라도 

                  공통적으로 같은 상태를 가질 때가 요구될 수 있다.

                  그 때 사용되는 Keyword가 static이다. 

                  매 객체마다 같은 값을 일일이 상태를 부여하는 것은 효율성이 떨어지므로

                  공유되는 값을 선언하는 것이 static이다.


                 * 원리

 프로그램이 실행 될 때, 

                 JVM은 메모리에서 Code영역 -> Static, Global영역 -> Stack 영역 -> Heap 영역의 순으로 

                 데이터를 탐색, 호출한다.

 Code에 Field와 Method들이 static으로 선언되어 있다면, 

                 JVM은 이들을 Class의 이름과 동반하여 Static, Global영역에 적재한다.

(class는 static으로 정의 할 수 없다.)

Application에 Class들를 선언하면, 

                JVM은 각 Class와 참조하는 Instance를 Stack과 Heap에 적재한다. 동일한 Class를 선언하여도

상태값을 달라지나, 공통적으로 같은 상태, 

                즉 무관한 상태를 호출하려면 Static, Globa영역에 있는 Field와 Method들을 호출한다.


* 상태와 무관한 상태 : static Field

상태와 무관한 행동 : static Method


Ex :        

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class ObjectTest{
    static int var;
    public static void pci(){
    }
 
    public static void main (String [] args){
        // static은 Class의 이름으로 접근 할 수 있도록 한다.
        // static은 같은 상태에 대한 접근이다.
        new ObjectTest().var;
        ObjectTest.var;
 
        new ObjectTest().pci();
        ObjectTest.pci();
        // 아래 처럼 사용하는 경우는 Field와 Method가 해당 Class의 내부에서만 호출이 가능하다.
        // 타 Class에서 사용할 때는 위 처럼 하도록 한다.
           var; 
        pci();
 
    } // end of main
// end of ObjectTest
cs

    

 -> final : 접근은 할 수 있으나 변경, 상속, Override가 불가능하도록 선언한 Keyword

 -> abstract : Sub Class에서는 구체적인 행동이 있으나,

                             Super Class에서는 구체적인 내용없이, 명시만 할 때 사용 되는 Keyword.

    abstract가 정의된 method를 abstract method라고 한다.


    abstract method는 Super Class에서 명시만 해두고, 

                             MethodBody 없이 구체적인 진술은 하지 않는다.

    그러나 이 Method는 Sub Class에서 반드시 Override를 해야 되는 강제성이 있다.

        abstract method가 있는 class를 abstract class라고 한다.


    abstract class는 일반화의 관계중 공통적이고 

                             일반적인 행위와 속성을 공유하는 목적으로 정의된 Class다.


      abstract class는 반드시 abstract라고 선언해야 한다.

    만약 그렇지 아니하고 Instance를 생성한다면, 

                             구체적인 내용이 없고 명시만 되어 있는 abstract method가 사용 될 수가 있다.


    이 method가 구체적 내용이 진술되어 있지 않아서 사용이 불가능하기 때문에 

                             abstract class를 반드시 정의해야된다.


    Instance 생성은 불가능하나 변수의 선언(Data Type)은 가능하다.

      abstract와 Casting을 활용하여 일괄적인 Data 관리가 가능하다.

 

  Ex :       

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
40
41
42
43
abstract class Super{
    public abstract void abstractMethod();
// end of Super
 
 
class Sub01 extends Super{
 
    public void abstractMethod(){
        // implementation for Sub01
    } // end of abstractMethod
 
// end of Sub01
 
class Sub02 extends Super{
 
    public void abstractMethod(){
        // implementation for Sub01
    } // end of abstractMethod
 
// end of Sub01
 
class Sub02 extends Super{
 
    public void abstractMethod(){
        // implementation for Sub02
    } // end of abstractMethod
 
// end of Sub02
 
class Test{
 
    public static void main(String [] args){
        Super [] var = new Super[3];
        var[0= new Sub01();
        var[1= new Sub02();
        var[2= new Sub03();
 
        for(int i = 0 ; i < var.length ; i ++){
            var[i].abstractMethod();
        }
 
    } // end of main
// end of Test
cs


'Java > Theory' 카테고리의 다른 글

[Java/Theory]14. Object  (0) 2016.05.31
[Java/Theory]13. null, Garbage collection  (0) 2016.05.31
[Java/Theory]11. Reference Type Casting  (0) 2016.05.30
[Java/Theory]10. API  (0) 2016.05.30
[Java/Theory]09. Import  (0) 2016.05.30