static을 사용하면 고정된 메모리 위치를 객체 생성 이전에 할당하게 된다.
static을 사용하지 않고 객체를 생성하는 경우 객체 생성시마다 메모리를 할당 해줘야 한다.
class World {
String myWorld = "MyWorld";
}
public class Main {
public static void main(String[]args){
//World 객체를 2번 생성, 생성할 때마다 메모리를 할당해야 함
World world1 = new World();
World world2 = new World();
}
}
static을 사용하는 경우 객체 생성이 몇 번 이더라도 static 영역에서의 메모리 할당은 한 번만 진행되게 된다. 따라서 메모리 공간을 아낄 수 있는 이점이 있다.
class World {
final static String myWorld = "MyWorld";
}
public class Main {
public static void main(String[]args){
//World 객체를 2번 생성, 메모리는 static 영역에서 한 번만 할당
World world1 = new World();
World world2 = new World();
}
}
final 키워드는 한 번 설정되면 그 값을 변경할 수 없다.
아래와 같은 코드를 실행하게 되면
class World {
int Year = 0;
World() {
this.Year++;
System.out.println(this.Year);
}
}
public class Main {
public static void main(String[]args){
//World 객체를 2번 생성, 각각의 메모리를 가지고 있음
World year1 = new World();
World year2 = new World();
}
}
아래와 같은 값을 가진다. 두 객체가 서로 다른 메모리에 할당되어 있기 때문이다.
1
1
하지만 static을 사용하면 값을 같은 메모리에서 공유하게 되므로
class World {
static int Year = 0;
World() {
Year++; // count는 더이상 객체변수가 아니므로 this를 제거
System.out.println(Year); // this 제거
}
}
public class Main {
public static void main(String[]args){
//World 객체를 2번 생성, 각각의 메모리를 가지고 있음
World year1 = new World();
World year2 = new World();
}
}
아래처럼 +된 값을 가지게 된다.
1
2
static 변수는 메모리 절약 보다는 주로 공유의 목적으로 사용한다.
static 메소드 안에는 객체 변수의 접근이 불가능하다. 그 이유는 메모리의 static 변수나 메소드는 동적으로 메모리를 할당하는 시점보다 먼저 메모리에 잡히게 된다. 따라서 자신보다 나중에 메모리에 할당되는 멤버 변수나 메소드는 언제 할당되었는지 알 수 없어 할당이 불가능하다.
class World {
static int year = 0;
int month = 0;
World() {
}
public static int getYear() {
//retrun month; 객체 변수는 호출이 불가능함
return ++year;
}
public int getMonth() {
this.month++;
return month;
}
}
public class Main {
public static void main(String[]args){
World month1 = new World();
World month2 = new World();
System.out.println(month1.getMonth());
System.out.println(month2.getMonth());
System.out.println(World.getYear()); // static 메소드는 객체 생성 없이 클래스를 이용하여 호출
System.out.println(World.getYear());
System.out.println(World.getYear());
}
}
실행 결과
1
1
1
2
3
static 블럭을 사용한 예시를 통해 더 확실히 알 수 있다.
class World {
static int year = 2022;
World() {
}
public static int getYear() {
//retrun month; 객체 변수는 호출이 불가능함
return ++year;
}
public static String STATIC_MESSAGE = "The New Year Coming soon";
static {
System.out.println("Good Bye");
System.out.println(year + "년");
}
}
public class Main {
public static void main(String[]args){
String staticMessage = World.STATIC_MESSAGE;
System.out.println("Hello");
System.out.println(World.getYear() + "년");
System.out.println(staticMessage);
}
}
실행 결과
Good Bye
2022년
Hello
2023년
The New Year Coming soon
static의 경우 가장 먼저 할당되고 작동되는 것을 알 수 있다.