티스토리 뷰

출처:

Java - 클래스 맴버, 인스턴스 맴버 (1/4) : 맴버란?

🙋🏻‍♂️ 맴버

객체도 구성원이 있으며 다음과 같다.

  1. 메소드
  2. 변수

따라서 객체를 만들기 위해서는 우선 class를 정의하고 그 안에 변수와 메소드를 정의하는 경우라면, 맴버를 모두 만드는 것과 동일하다.

중요한 것은 class 내부의 변수는 해당 class를 사용하여 만든 instance에서 모두 같은 값을 갖지만, instance를 선언할 때 사용하는 변수의 경우 예로 위의 left와 right의 경우instance마다 모두 다르게 지정할 수 있다.

class Calculator3 {
    public static void sum(int left, int right) {
        System.out.println(left + right);
    }

    public static void avg(int left, int right) {
        System.out.println((left + right) / 2);
    }
}

public class CalculatorDemo3 {
    public static void main(String[] args) {
        Calculator3.sum(10, 30);
        Calculator3.avg(10, 30);

        Calculator3.sum(20, 40);
        Calculator3.avg(20, 40);
    }
}

위에서 static을 사용하면 인스턴스를 지정할 필요없이 method를 바로 이용할 수 있다. 즉 직접 접근이 가능하다. 위 예제 말고 클래스에 대한 예제가 엄청 많은데, 해당 예제들은 인스턴스로 만들어서 메소드를 호출하는 방식부터 지금처럼 호출하지 않고 바로 코드를 짜는 방식(static을 사용해야 함) 등 다양함.

중요한 것은 아래의 예제이다.

  1. 인스턴스 메소드는 클래스 맴버에 접근할 수 있다.
  2. 클래스 메소드는 인스턴스 맴버에 접근할 수 없다.
// class와 instance 관련 접근 예제임

class C1 {
    static int static_variable = 1; // static이 붙어 있기 때문에 class 변수임
    int instance_variable = 1; //  단순히 int만 있기 때문에 인스턴스 변수임

    // class 메소드
    static void static_static () {
        // 인스턴스가 클래스 메소드에 접근하는 것은 가능하고
        //
        System.out.println(static_variable);
    }

    static void static_instance() {
        // 클래스 메소드에서는 인스턴스 변수에 접근할 수 없다.
        // System.out.println(instance_variable);
    }

    // instance 메소드
    void instance_static () {
        // 인스턴스 메소드는 클래스 변수에 접근 가능하다.
        System.out.println(static_variable);
    }

    void instance_instance () {
        System.out.println(instance_variable);
    }
}

public class ClassMemberDemo {
    public static void main(String[] args) {
        
        C1 c1 = new C1();
        // instance를 만들면 instance는 정적(static) method나 변수에 접근이 가능하기 때문에
        // 만들어진다.

        c1.static_static();
        // 인스턴스 맴버(c1)은 클래스 메소드(static_static)에 접근할 수 있으며
        // 해당 class 메소드가 class 변수를 사용하고 있기 때문에 접근이 가능하다.
        // error 남

        c1.static_instance();
        // 클래스 메소드는 인스턴스 맴버(c1)에 접근할 수 없기 때문에 에러남

        c1.instance_static();
        // instance 메소드는 class 변수에 접근할 수 있음

        c1.instance_instance();
        // instance 메소드는 instance 변수에 접근할 수 있음.

        C1.static_static();
        // class를 통해서 class에 직접 접근할 수 있음

        C1.static_instance();
        // 해당 class 메소드가 인스턴스 변수에 접근하고 있기 때문에
        // 실행이 안됨

        C1.instance_static();
        // instance 메소드는 class 변수(static)에 접근 가능하지만
        // 클래스로 직접 접근하려고 하기 때문에
        // 위 코드는 불가능

        C1.instance_instance();
        // 클래스를 통해 인스턴스 메소드에 직접 접근하려고 하기 때문에
        // 위 코드는 불가능
    }
}

정리하자면

  • 인스턴스 변수 (Non-Static Field)
  • 클래스 변수 (Static Field)

참고로 필드라는 것은 클래스 전역에서 접근할 수 있는 것을 의미함.