본문 바로가기
Java/Java 기초문법

[JAVA 기초] 자바 클래스 멤버와 인스턴스 멤버

by dev수니 2021. 3. 9.
반응형

 

 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
package java_practice;
 
class Check{
    static int cv = 5;    // 클래스 변수
    int iv = 4;            // 인스턴스 변수
    
    static void cm() {    //클래스 메서드
    }
    
    void im() {            // 인스턴스 메서드
    }
    
     static void cm_Imember() {    // 오류! 클래스메서드가 인스턴스멤버에 접근
//         System.out.println(iv);
//         im();
         System.out.println("클래스 메서드가 인스턴스 멤버에 접근 불가!");
     }
     
     static void cm_Cmember() {    // 클래스메서드가 클래스멤버에 접근
         System.out.println(cv);
         cm();
     }
     
     void im_Cmember() {    // 인스턴스메서드가 클래스멤버에 접근
         System.out.println(cv);
         cm();
     }
     
     void im_Imember() {    // 인스턴스메서드가 인스턴스멤버에 접근
         System.out.println(iv);
         im();
     }
}
public class Method_Member {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Check.cm_Imember();
        Check.cm_Cmember();
        Check check = new Check();
        check.im_Cmember();
        check.im_Imember();
    }
}
cs

실행결과

클래스 메서드가 인스턴스 멤버에 접근 불가!
5
5
4

 

 

결과를 보면 경우의 수 중에 cm_Imember 메서드, 즉 클래스 메서드가 인스턴스 멤버에 접근할 때 에러가 발생한다. 이는 아직 인스턴스가 생성되지 않았기 때문에 존재하지 않는 멤버에 접근하는 것과 같기 때문이다. 인스턴스 메서드에서 인스턴스 멤버로 접근이 가능한 이유는 인스턴스 메서드를 쓰는 시점에서 이미 인스턴스가 반드시 생성된 이후일 것이기 때문이다.

반응형

댓글