Java] Static

Static 변수

Static 변수, 클래스 변수, 정적 변수라고도 불린다.

static으로 선언된 변수는 메모리 공간에 하나만 존재하며, 어디서나 접근이 가능한 변수이다.

(단, 어디서나 접근이 가능하려면 접근 제어자 public이 선언되어야 한다.)

static 변수는 처음 프로그램이 로드 될 때 데이터 영역에 생성 됨

인스턴스의 생성과 상관없이 사용할 수 있으므로 클래스 이름으로 참조

1
Student.serialNum = 100;

클래스 변수, 정적 변수라고도 함

Static 변수 접근방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class AccessWay {
static int num = 0;

public AccessWay() {
increaseCnt();
}

public void increaseCnt() {
num++; //방법1
}
}

public class Test {
public static void main(String[] args) {
AccessWay way = new AccessWay();
way.num++; //방법2
AccessWay.num++; //방법3
System.out.println(AccessWay.num); //3
}
}

static 변수와 인스턴스 변수

데이터 영역에 위치한 동일한 메모리 참조

프로그램에서 변수의 유형

static변수는 인스턴스가 생성되기 이전에 별도의 메모리 공간에 할당되어 초기화까지 완료

-> static 변수가 초기화되는 시점은 JVM에 의해서 클래스가 메모리 공간에 올라가는 순간

때문에, static변수를 생성자를 통해서 초기화하면 안된다.

-> 생성자를 통해서 초기화를 하면, 인스턴스가 생성될 때마다 새로운 값이 대입되어 버리기 때문이다.

클래스 내부 또는 외부에서 참조의 용도로만 선언된 변수는 static final로 선언한다.

Static Method

System.out.println()

System.out.println()에 대해서 자세히 알아보자.

System은 java.lang이라는 패키지 안에 있는 클래스의 이름이다.

1
java.lang.System.out.println("이렇게 해도 된다.");

이렇게 하지 않아도 나오는 이유는 컴파일러가 자동으로 해주게 설정되어 있기 때문이다.

컴파일러가 자동으로 import java.lang.*;을 해주고 있기에 쓰지 않고도 사용이 가능하다.

println()이 method 역할을 하고 있는 것을 보면 out은 static 참조 변수일 것이다.

out은 java.io 패키지에서 PrintStream Class를 참조 받는 변수이다.

1
public final static PrintStream out = null;

println()은 PrintStream Class에 있는 method로서 오버로딩 되어 있다.

1
2
3
4
5
6
7
8
9
10
11
12
public void println() {
newLine();
}

public void println(boolean x) {
synchronized (this) {
print(x);
newLine();
}
}

// 오버로딩 method...

public static void main

main 메소드는 인스턴스의 생성과 상관없이 JVM에 의해 호출이 되므로 반드시 static으로 선언해야 한다.

main을 담고 있는 class는 찾을 수 없다. 어디서 담고 있든 상관 없고 위의 내용이 가장 중요하다.