본문 바로가기
코딩/JAVA

클래스 멤버와 인스턴스 멤버간의 참조와 호출_자바의 정석

by letsgoit39 2021. 7. 21.
728x90

인스턴스 멤버(인스턴스변수와 인스턴스메서드)는
반드시 객체를 생성한 후에만 참조 또는 호출이 가능하다.

따라서 클래스 멤버가 인스턴스멤버(인스턴스변수와 인스턴스메서드)를
참조, 호출하기 위해서는
반드시 객체를 생성하여야 한다.

(왜냐하면 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만,

클래스 멤버가 존재할 때 인스턴스 멤버는 존재하지 않을 수도 있음

_JVM의 메모리 구조 참고https://letsgoit39.tistory.com/6)

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
class MemberCall {
    int iv = 10;
    static int cv = 20;
 
    int iv2 = cv;
//    static int cv2 = iv;        // 에러. 클래스변수는 인스턴스 변수를 사용할 수 없음.
    static int cv2 = new MemberCall().iv;     // 이처럼 객체를 생성해야 사용가능.
 
    static void staticMethod1() {
        System.out.println(cv);
//        System.out.println(iv); // 에러. 클래스메서드에서 인스턴스변수를 사용불가.
        MemberCall c = new MemberCall();    
        System.out.println(c.iv);   // 객체를 생성한 후에야 인스턴스변수의 참조가능.
}
 
    void instanceMethod1() {
        System.out.println(cv);        
        System.out.println(iv); // 인스턴스메서드에서는 인스턴스변수를 바로 사용가능.
}
 
    static void staticMethod2() {
        staticMethod1();
//        instanceMethod1(); // 에러. 클래스메서드에서는 인스턴스메서드를 호출할 수 없음.
        MemberCall c = new MemberCall();
        c.instanceMethod1(); // 인스턴스를 생성한 후에야 호출할 수 있음.
     }
    
    void instanceMethod2() {    // 인스턴스메서드에서는 인스턴스메서드와 클래스메서드
        staticMethod1();        //  모두 인스턴스 생성없이 바로 호출이 가능하다.
        instanceMethod1();
    }
}
 
cs

위의 코드를 볼 때,

클래스멤버(클래스변수와 메서드)에서

인스턴스멤버(인스턴스변수와 메서드)를 참조, 호출하려면

객체를 생성해야만 가능하다는 사실을 확인하고 기억하고 넘어가자

728x90