[java] static 변수, static 메소드 와 인스턴스 간의 참조와 호출

반응형

1. static 변수, 메소드 와 인스턴스 간의 참조와 호출

같은 클래스에 속한 변수, 메소드 간에는 별도로 인스턴스를 생성하지않고 참조 및 호출이 가능하다.

단, static 변수와 static 메소드가 인스턴스 변수와 메소드를 참조 및 호출하려면 인스턴스를 생성해야 한다.

 

왜냐하면, 인스턴스 변수와 인스턴스 메소드가 존재하는 시점에 static 변수와 static 메소드는 항상 존재하지만, static 변수와 static 메소드가 존재하는 시점에는 인스턴스 변수와 인스턴스 메소드가 존재하지 않을 수도 있기때문이다.

 

JVM 은 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

static 변수와 static 메소드는 JVM 이 클래스 파일(*.class) 을 읽어 메소드 영역(Method Area)에 저장할때 생성된다.

반면, 인스턴스는 프로그램 실행 중 new 연산으로 생성될때 힙 (Heap) 영역에 생성된다.

 

(참고 : JVM 의 동작) 

 

[java] static 변수, static 메소드 란?

1. static 이란? static 이란 '정적인', '고정적인' 이라는 사전적 의미를 가진다. 이를 java 관점으로 해석하면 '클래스의' 또는 '공통적인' 이라는 의미를 가진다. static 을 이해하기 위해서는 먼저 JVM (

gymdev.tistory.com

 

인스턴스는 static 과 생성되는 시점이 다르기 때문에 인스턴스를 생성해야 참조 및 호출이 가능하다.

 

2. 예제코드

public class MyStaticTestClass {

    /** 인스턴스 변수 */
    public String instanceVal = "인스턴스 변수";
    
    /** static 변수 */
    public static String staticVal = "static 변수";

    // 인스턴스 변수는 static 변수를 참조할 수 있다.
    public String newInstanceVal = staticVal; // OK

    // 인스턴스 변수를 사용하기 위해서는 인스턴스를 생성햐야 한다.
//  public static String staticVal2 = instanceVal; // NG
    public static String newStaticVal = new MyStaticTestClass().instanceVal; // OK
    
    /** 인스턴스 메소드 */
    public void instanceMethod() {
        System.out.println("MyStaticTestClass.instanceMethod() 실행");
    }

    /** static 메소드 */
    public static void staticMethod() {
        System.out.println("MyStaticTestClass.staticMethod() 실행");
    }

    /**
     * 인스턴스 메소드에서의 호출
     * 인스턴스 멤버간의 호출에는 문제가 없다.
     * 인스턴스가 존재한다는 것은 인스턴스가 이미 생성되었다는 의미이므로 다른 인스턴스멤버들도 존재하기 때문이다.
     */
    public void callMethod() {
        instanceMethod(); // OK
        staticMethod(); // OK
    }

    /**
     *  static 메소드에서의 호출
     *  인스턴스가 존재하는 시점에 static 은 항상 존재하지만,
     *  static 이 존재하는 시점에 인스턴스가 존재하지 않을 수도 있다.
     *  따라서, static 메소드가 인스턴스 메소드를 참조 또는 호출하기 위해서는 인스턴스를 생성해야한다.
     */
    public static void callMethod2() {
//      instanceMethod(); // NG , 같은 클래스의 static 메소드에서 인스턴스 메소드를 호출할 수 없다.
        // 호출하기 위해서는 인스턴스를 생성해야 한다.
        MyStaticTestClass myStaticTestClass = new MyStaticTestClass();
        myStaticTestClass.instanceMethod();
        staticMethod(); // OK
    }
}

 실행확인

@Test
@DisplayName("클래스멤버(static)와 인스턴스멤버 간의 참조와 호출")
public void callStaticMethod() {
    // 인스턴스 메소드 호출
    System.out.println("인스턴스 메소드 호출 : 객체 생성 후 호출");
    MyStaticTestClass testClass = new MyStaticTestClass();
    testClass.callMethod();

    // static 메소드 호출
    System.out.println("static 메소드 호출 : 객체 생성없이 바로 참조가능");
    MyStaticTestClass.callMethod2();
}

 출력

인스턴스 메소드 호출 : 객체 생성 후 호출
MyStaticTestClass.instanceMethod() 실행
MyStaticTestClass.staticMethod() 실행
static 메소드 호출 : 객체 생성없이 바로 참조가능
MyStaticTestClass.instanceMethod() 실행
MyStaticTestClass.staticMethod() 실행

 

3. 정리 

  1. 인스턴스 멤버 (변수, 메소드) 의 참조 및 호출
    • 인스턴스 멤버간의 호출에는 문제가 없다. 인스턴스가 존재한다는 것은 인스턴스가 이미 생성되었다는 의미이므로 다른 인스턴스멤버들도 존재하기 때문이다.
  2.  static 멤버 (변수, 메소드) 의 참조 및 호출
    • 인스턴스가 존재하는 시점에 static 은 항상 존재하지만, static 이 존재하는 시점에 인스턴스가 존재하지 않을 수도 있다. 따라서, static 메소드가 인스턴스 메소드를 참조 또는 호출하기 위해서는 인스턴스를 생성해야한다.

 

클래스 멤버(static)가 인스턴스 멤버를 참조 및 호출해야하는 일은 거의 없다.
만약 그런 경우가 발생한다면, 인스턴스 멤버로 해야할 것을 클래스 멤버(static)로 작성한것은 아닌가 검토해야한다.

 

 

반응형