1. static 변수
인스턴스 변수는 인스턴스가 생성되었을 때접근이 가능한 변수이다.
반대로 클래스 변수는 클래스가 정의만 되어도 접근이 가능한 변수이기 때문에 클래스 변수라고 한다.
즉, static으로 선언된 변수는 메모리 공간에 하나만 존재하며, 어디서나 접근이 가능한 변수이다. (public으로 선언된 경우만)
static 변수가 초기화 되는 시점은, JVM에 의해서 클래스가 메모리 공간에 올라가는 순간이다.
예를 들면 PI와 같이 인스턴스 간에 데이터 공유가 필요한 상황에서는 static 변수를 선언하는 것이 유용하다.
특히 참조의 용도로만 선언된 변수는 static final로 선언하면 편리하다.
static final double PI = 3.141592; 로 클래스 내에 선언하면 상수화가 되어 값이 변할 걱정도 없고, static이기 때문에 쓸데없이 메모리를 차지하지도 않는다. 게다가 변경이 불가능하기 때문에 public으로 외부 접근을 허용해도 문제가 없다.
2. static 메소드
static 메소드도 변수와 마찬가지로 인스턴스를 생성하지 않아도, 클래스 이름을 통해 호출이 가능하다.
하지만 static 메소드는 인스턴스 변수, 메소드에 접근이 불가능하다. 서로 존재하는 경계가 다르기 때문에, 접근과 호출이 불가능하다. static 메소드에서 인스턴스 변수를 변경한다고 하면, 어느 인스턴스의 값을 변경할 것인지, 모두 변경할 것인지 등의 문제가 발생하고, 바람직한 구조가 아닐 것이다.
3. public static void main()
main 클래스는 어디에 위치해야 하는가. 물어본다면 JVM에서 딱 한번만 호출되는 main 메소드는 어디에든 정의되어도 상관이 없다.
인스턴스의 생성과 상관없이 JVM에 의해 호출이 되므로 반드시 static으로 선언해야 한다.
'프로그래밍 > Java' 카테고리의 다른 글
[Java] Garbage Collection (0) | 2020.08.21 |
---|---|
[Java] 자바 가상머신의 메모리 모델 (0) | 2020.05.20 |
[Java] 자바 프로그램의 이해와 실행의 원리 (0) | 2020.05.14 |
[Java] 쓰레드(Thread) (0) | 2020.02.12 |
[Java] 입출력 스트림 (0) | 2020.02.10 |