Programing

class, instance member 좀 더 알아보기

handam 2015. 9. 1. 17:27
반응형




- 개요


Instance Member, Class Member



- 요점


1. 인스턴스 메소드는 클래스 멤버에 접근 할 수 있다.

2. 클래스 메소드는 인스턴스 멤버에 접근 할 수 없다.


인스턴스 변수는 인스턴스가 만들어지면서 생성되는데, 클래스 메소드는 인스턴스가 생성되기 전에 만들어지기 때문에 클래스 메소드가 인스턴스 맴버에 접근하는 것은 존재하지 않는 인스턴스 변수에 접근하는 것과 같다.


예제1) 생활코딩 (클래스 멤버와 인스턴스 멤버)


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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
public class Calculator {
        
    static int static_variable = 1;
    int instance_variable = 2;
    
    static void static_static(){
        System.out.println(static_variable);
    }
    
    static void static_instance(){
        // 클래스 메소드에서는 인스턴스 변수에 접근 할 수 없다. 
//        System.out.println(instance_variable);
    }
    
    void instance_static(){
        // 인스턴스 메소드에서는 클래스 변수에 접근 할 수 있다.
        System.out.println(static_variable);
    }
    
    void instance_instance(){        
        System.out.println(instance_variable);
    }
}
 
 
 
 
public class CalculatorDemo1 {
     
    public static void main(String[] args) {
        Calculator c = new Calculator();
        // 인스턴스에서 정적 메소드에 접근 -> 성공
        // 인스턴스 메소드에서 정적 변수에 접근 -> 성공
        c.static_static();
        System.out.println("---------------------------------------------001");
        // 인스턴스에서 정적 메소드에 접근 -> 성공
        // 정적 메소드에서 인스턴스 변수에 접근 -> 실패
        c.static_instance();
        System.out.println("---------------------------------------------002");
        // 인스턴스에서 인스턴스 메소드에 접근 -> 성공
        // 인스턴스 메소드에서 클래스 변수에 접근 -> 성공
        c.instance_static();
        System.out.println("---------------------------------------------003");
        // 인스턴스에서 인스턴스 메소드에 접근 -> 성공 
        // 인스턴스 메소드에서 인스턴스 변수에 접근 -> 성공
        c.instance_instance();
        System.out.println("---------------------------------------------004");
        // 클래스에서 클래스 메소드에 접근 -> 성공
        // 클래스 메소드에서 클래스 변수에 접근 -> 성공
        Calculator.static_static();
        System.out.println("---------------------------------------------005");
        // 클래스에서 클래스 메소드에 접근 -> 성공
        // 클래스 메소드에서 인스턴스 변수에 접근 -> 실패
        Calculator.static_instance();
        System.out.println("---------------------------------------------006");
        // 클래스에서 인스턴스 메소드에 접근 -> 실패
//        C1.instance_static();
        // 클래스에서 인스턴스 메소드에 접근 -> 실패
//        C1.instance_instance();
    }
}
cs




예제2)


1
2
3
4
5
6
7
8
9
10
class AAA {
    int num1;
    static int num2;
    static void changeNum() {
        num1++;    //문제 됨
        num2++;    //문제 안됨
    }
    ...
}
 
cs



단순히 위의 changeNum() 메소드 호출을 생각하면 크게 문제가 되지 않을 것이라고 생각할 수 있다.


하지만 변수 num1은 인스턴스 변수이고, num2는 static 으로 선언된 클래스 변수이다.


changeNum() 메소드 역시 클래스 메소드이므로 클래스 멤버에서 인스턴스 멤버의 접근이 불가능하다.




예제3)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class AAA {
    static int cnt = 0
    
    public static void makeAAA(int n) {
        cnt++;
        
        if (n == 0) {
            System.out.println("println cnt ... " + cnt);
        } else {
            System.out.println("println other cnt ... " + cnt);
        }
    }
    
    public static void main(String[] args) {
        AAA a1 = new AAA();    //AAA class 의 instance 생성
        a1.makeAAA(1);    //instance method 호출 (이지만 class method)
        AAA.makeAAA(1);    //class method 호출 Error
    }
}
 
cs





반응형