[20210621] static in java

static에 대해서 완벽히 정복해보자!

static에 대한 개념을 잘 이해하려면 인스턴스 개념과의 차이를 잘 알아야 한다.

static 변수의 접근방법

클래스 내부에서 접근하는 방법

클래스에 선언된 static 변수는 클래스 내부 어디서든지 접근 가능하다.

클래스 외부에서 접근하는 방법

class AccessWay {
    static int num = 0;
}

해당 클래스가 존재한다고 하자.

AccessWay.num++;

클래스 이름으로 접근하는 방법이 있고,

AccessWay way = new AccessWay();
way.num++;

인스턴스의 이름으로 접근하는 방법이 있다.

인스턴스 변수로 static 변수에 접근할 수는 있지만, 인스턴스 변수의 접근방법과 구분이 되지 않기 때문에 클래스 이름으로 접근하는 것이 좋다.

static 변수의 초기화 시점

static 변수는 인스턴스를 하나도 생성하지 않고도 접근할 수 있음. static 변수는 인스턴스가 생성되기 이전에 별도의 메모리 공간(JVM의 메서드 영역)에 할당되어 초기화까지 완료되기 때문. static 변수가 초기화 되는 정확한 시점은 사용하려는 static 변수가 처음 호출될 때, 해당 static 변수가 선언되어 있는 클래스 파일이 메모리 공간에 올려지는 시점이다.

자바 프로그램의 실행 원리 다른 언어로 구현되어 있는 프로그램은 컴파일이 완료되면 하나의 실행파일이 만들어진다. 그런데 자바 프로그램은 컴파일이 완료되면 여러 개의 클래스 파일들만 생성된다. 하나의 실행파일로 만들어진 프로그램은 실행 되기 위해서 실행파일 전부가 한꺼번에 메모리 공간에 올라가야 한다. 하지만 자바는 필요한 만큼만 메모리 공간에 올리는 방식으로 실행이 된다. 그래서 JVM은 처음 자바 프로그램을 실행할 때, 하나의 클래스만 메모리 공간에 올려서 프로그램을 실행한다.(해당 클래스가 제대로 실행되려면 main 메소드가 선언되어 있어야함) 그리고 필요에 따라 사용하는 클래스 파일만 메모리 공간에 올린다. 프로그램이 종료될 때까지 사용하지 않는 클래스는 메모리 공간에 올려지지 않는다. 이를 On-demand 실행 방식이라고 함.

static 메소드의 정의와 호출

static 변수와 마찬가지로 인스턴스를 생성하지 않아도 static 메소드를 호출할 수 있다. 만약 클래스의 메소드 중에 인스턴스 변수를 접근하지 않고 있는 메소드는 static으로 선언하는 것을 고려 해볼 수 있다.(코드가 간결해짐) 한 가지 주의할 점은 static 메소드에서 인스턴스 변수에 접근할 수 없다는 것이다. static 메소드와 인스턴스 변수의 초기화 시점이 다르기 때문에 어떻게 보면 당연한 소리 일수도 있다.

public static void main

자바 포로그램의 시작과 끝을 구성하는 메소드이다. JVM에 의해 호출이 되기 때문에 static으로 선언해야 한다.


출처

윤성우 저, 난 정말 java를 공부한 적이 없다구요