Java를 공부하다보면 static을 자주 접했을 것이고 또 static과 final에 대해 느낌적으로는 알지만 이론적, 개념적으로는 헷갈리는 경우가 있을 것이다. 그래서 오늘은 이에 관해 포스팅할 것이다.

1. Static이란?

Java에서 static 키워드를 사용한다는 것은 어떠한 값이 메모리에 한번 할당되어 프로그램이 끝날 때 까지 그 메모리에 값이 유지된다는 것을 의미한다. 쉽게 설명하자면 특정한 값을 공유를 해야하는 경우라면 static 사용 시 메모리의 이점을 얻을 수 있다. 값 보다는 메모리라는 말을 좀 더 생각해 보면 이해가 될 것이다. 예제를 통해 이해를 해보자.

static 변수

예를 들어 게시물을 누를때마다 좋아요 값을 증가시키는 HeartCounter기능을 구현 해야한다고 가정을 하자.

// 이 코드는 반드시 직접 실행해 보기 바랍니다.
public class HeartCounter {

    // static 변수로 실행했을 때와 일반 변수로 실행했을 때의 차이점 깨닫기!
    int count;
    //static int count;

    public HeartCounter() {
        this.count ++;
        System.out.println("좋아요 갯수 : " + this.count);
    }

    public static void main(String[] args) {
        HeartCounter hc1 = new HeartCounter();
        HeartCounter hc2 = new HeartCounter();
    }
}

위의 예제에 대한 결과를 직접 적지는 않겠다. 그 이유는 직접 코드를 작성함으로써 static이 어떠한 동작을 하는지를 직접 이해했으면 하는 바램이 있기 때문이다.

부가 설명을 하자면 인스턴스 변수는 클래스가 생성될때 메모리 공간이 할당되고 생성자에 있는 값으로 초기화가 된다. 그러나 static변수(클래스 변수)는 어디에서 선언이 되더라도 그 클래스 내에서는 공유가 되어진다. static이 선언되는 순간에 하나의 메모리 공간이 할당되기 때문이다.

예제에서 인스턴스 변수를 사용하면 hc1, hc2객체가 생성되면 hc1의 count와 hc2의 count가 서로 다른 메모리를 할당 받는다. 그러나 static변수를 사용하면 두 객체가 생성 될 때 count는 하나의 메모리만 할당을 받게 되는 것이다.

static 메서드(정적 메서드)

staic메서드는 객체의 생성 없이 호출이 가능하고, 객체에서는 호출이 불가능하다. 또한 static 메서드 안에서는 인스턴스 변수 접근이 불가능하다. 위 예제에서

// 생략

public static int getCount() {
        return count;
    };

public static void main(String[] args) {
        HeartCounter hc1 = new HeartCounter();
        HeartCounter hc2 = new HeartCounter();

        System.out.println("총 count " + HeartCounter.getCount());
    }

이 코드를 추가해서 main메서드에 넣은 후 실행 해보고 아까와 같이 count 변수를 static 변수와 인스턴스 변수로 선언해서 실행했을 때 어떠한 일이 일어나는지 각자 확인보자.
그러면 인스턴스변수로 선언했을 때 오류가 날 것이다. 또한 getCount() 메서드는 지금 static으로 선언을 했기때문에 hc1이나 hc2객체로 호출을 하지 않아도 된다.

결론

  1. 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.
    • 인스턴스를 생성하면, 각 인스턴스들은 서로 다른 메모리들의 주소를 할당 받기 때문에 서로 다른 값을 유지한다. 하지만 인스턴드을이 공통적인 값이 유지되어야 하는 경우에는 static을 붙인다.
  2. 전역으로 자주 사용할 메서드를 static메서드로 만들어 사용한다.
    • 프로젝트 내에서 공통적으로 사용해야할 메서드가 있으면 static 메서드로 만들어서 불필요한 코드의 수를 줄인다. 이때 인스턴스 변수가 메서드 내부에 필요한가에 대해서도 고려를 해야한다.

참고한 블로그 및 사이트들
https://vaert.tistory.com/101
https://wikidocs.net/228
https://mangkyu.tistory.com/47