전공공부/자바 (JAVA)

[JAVA] Static? 그거 왜 붙이는건데?

jooona 2022. 1. 19. 22:55
반응형

Static. 자바를 이용하여 개발을 하다 보면 참 많이 마주치는 키워드입니다. 당장 main 함수를 선언할 때만 보더라도

 

public static void main(String[] args){ ... }

 

요렇게 static이 떡하니 붙어있죠.

 

그렇다면 static이 왜 붙어있는지, 도대체 무엇인지, 어떻게 쓰이는 것인지 알아보도록 하겠습니다.

 

Static이란?

Static은 '정적인, 고정된'이라는 뜻을 가지고 있습니다. 이러한 이름을 가지는 이유는 바로 static이 앞에 붙는 변수나 메서드는 어떤 객체에 소속되는 것이 아닌, 클래스에 고정되어 있는 변수나 메서드이기 때문입니다.

 

Static의 특징을 먼저 살펴보겠습니다.

 

1. 메모리에 고정적으로 할당된다.

2. 객체 생성 없이 사용할 수 있다.

3. 프로그램이 시작되면 메모리의 static 영역에 적재되고, 프로그램이 종료될 때 해제된다.

4. Static 메서드 내에서는 인스턴스 변수를 사용할 수 없다.

 

이제 이 특징들을 차례로 살펴보겠습니다.

 

1. 메모리에 고정적으로 할당된다.

Static이 붙지 않은 메서드나 변수의 경우 객체가 생성될 때마다 호출되어 서로 다른 값을 가지고 있을 수 있습니다. 그렇기 때문에 각 객체들에서 공통적으로 하나의 값이 유지되어야 할 경우 static을 유용하게 사용할 수 있습니다.

 

2. 객체 생성 없이 사용할 수 있다.

어떤 객체에 소속되어있다는 뜻은 new 키워드를 이용하여 객체를 생성하여야만 해당 변수나 메서드를 사용할 수 있다는 뜻입니다. 다음의 코드를 한 번 살펴보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
public class Main {
 
    public void print(){
        System.out.print("이게 실행될까요");
    }
 
    public static void main(String[] args){
        print();
    }
}
cs

 

과연 print라는 메서드는 동작할 수 있을까요? 불행히도 동작하지 않고 컴파일 에러가 발생합니다. 그 이유는 print라는 메서드는 static 메서드가 아니기 때문에 Main이라는 객체가 생성되어야 실행될 수 있기 때문입니다. 위의 코드를 동작시키려면 아래와 같이 코드를 작성해야 합니다. 

 

1
2
3
4
5
6
7
8
9
10
11
public class Main {
 
    public void print(){
        System.out.print("이게 실행될까요");
    }
 
    public static void main(String[] args){
        Main main = new Main();
        main.print();
    }
}
cs

 

하지만 static 키워드가 앞에 붙는다면 이야기가 달라집니다. 

 

1
2
3
4
5
6
7
8
9
10
public class Main {
 
    public static void print(){
        System.out.print("이게 실행될까요");
    }
 
    public static void main(String[] args){
        print();
    }
}
cs

 

단지 static만 붙였을 뿐인데 이 코드는 당당하게 실행됩니다. 이렇듯 static 키워드를 붙이면 객체 생성 없이도 메서드나 변수를 사용할 수 있습니다. 어떻게 이게 가능한지는 바로 다음에 나옵니다.

 

3. 프로그램이 시작되면 메모리의 static 영역에 적재되고, 프로그램이 종료될 때 해제된다.

프로그램이 시작되어 클래스가 메모리에 올라가게 되면 static이 붙은 변수나 메서드는 클래스와 함께 자동으로 메모리의 static 영역에 생성됩니다. 자동으로 메모리에 올라가기 때문에 객체를 생성할 필요 없이 사용이 가능한 것입니다. 또한 자동으로 메모리에 올라가기 때문에 main함수를 static으로 구현하여 바로 실행할 수 있도록 만들어 주는 것입니다.

 

일반적인 메서드는 객체를 생성하면 메모리의 Heap 영역에 올라가게 됩니다. 메모리의 이 Heap 영역은 Garbage Collector에 의해 자동으로 관리되게 됩니다. 즉 사용하지 않는 객체의 경우 알아서 삭제시킴으로써 메모리를 관리해줍니다.

 

반면 static 메서드는 static 영역에 존재하기 때문에 이러한 관리를 받지 못합니다. 따라서 프로그램이 종료될 때 메모리를 해제하게 되는데, 이 때문에 과도하게 많은 static을 선언할 경우 메모리에 과부하가 올 수 있습니다.

 

또한 프로그램이 시작될 때 static 영역의 메모리 크기를 넘어서는 양의 static 메서드들이 존재한다면, 시작과 동시에 에러가 날 수도 있습니다. 그렇기 때문에 사용하기 쉽다고 해서 무분별하게 static을 남발하는 것은 조심해야 합니다. 

 

4. static 메서드 내에서는 인스턴스 변수를 사용할 수 없다.

Static 메서드는 프로그램 실행과 동시에 메모리에 올라가기 때문에 인스턴스 변수는 사용할 수 없습니다. 인스턴스 변수는 객체를 생성해야만 사용이 가능하기 때문에 객체를 생성하기 전에 먼저 메모리에 올라가는 static 메서드에서는 사용할 수 없는 것입니다. 그래서 메서드에 static을 붙여주고 싶다면, 해당 메서드 내부에 인스턴스 변수나 인스턴스 메서드를 사용하는 부분이 있는지 먼저 확인해주어야 합니다.

 

물론 반대로 인스턴스 메서드에서 static 변수를 사용하는 것은 전혀 문제 되지 않습니다.

 

 

반응형