[Java] static을 왜 붙이는건데?!

유빈·2024년 10월 1일

생존 Java

목록 보기
3/3
post-thumbnail

static.. 네가 궁금하다... 정체가 뭐냐?



static의 정의

static = 정적인, 고정된


static이 앞에 붙는 변수나 메서드는 어떤 객체에 소속되는 것이 아닌, 클래스에 고정되어 있는 변수나 메서드이기 때문이다.



static의 특징

  1. 메모리에 고정적으로 할당된다.
  2. 객체 생성 없이 사용 가능하다.
  3. 프로그램이 시작되면 메모리의 static 영역에 저장되고, 프로그램이 종료될 때 헤제된다.
  4. static 메서드 내에서는 인스턴스 변수 사용 불가하다.



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

static을 붙여 각 인스턴스들에서 공통적으로 하나의 값이 유지되도록 할 때, static을 유용하게 사용할 수 있다.



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

어떤 객체에 소속되어 있다는 것 = new 키워드를 이용히여 객체를 생성해야만 해당 변수나 메서드를 사용할 수 있다.


package classRepeat;

public class Main {
    public void print() {
        System.out.println("실행 가능?");
    }

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

컴파일에러 발생

-> print라는 메서드는 static 메서드가 아니다.
-> static 메서드가 아니므로 Main이라는 객체가 생성되어야 실행될 수 있다.


package classRepeat;

public class Main {
    public void print() {  
        System.out.println("실행 가능?");
    }

    public static void main(String[] args) {
        Main main = new Main();  
        main.print();
    }
}

위와 같이 Main 객체를 생성하고 print()를 실행하면, 제대로 동작하게 된다.

static만 추가한다면, 위와 같이 객체를 생성할 필요 없이 바로 실행 가능하다.


package classRepeat;

public class Main {
    public static void print() {
        System.out.println("실행 가능?");
    }

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


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

프로그램이 시작되어 클래스가 메모리에 올라가면, static이 붙은 변수나 메서드는 클래스와 함께 자동으로 메모리의 static 영역에 생성된다. 자동으로 메모리 영역에 올라가므로 객체를 따로 생성할 필요 없이 사용 가능한 것이다.

public static void main(String[] args)

위의 main 함수 또한 static이 붙어있으므로 자동으로 메모리에 올라가서 바로 실행할 수 있는 것이다.


그럼 static이 붙지 않은 변수나 메서드는 자동으로 메모리 영역에 올라가지 않는가?

YES. static이 붙지 않는 인스턴스 변수나 지역 변수는 인스턴스가 생성될 때, 변수 선언문이 수행될때 메모리가 할당된다. 그러므로, 그 전에는 메모리 영역에 올라가지 않는다는 사실.


일반적인 메서드는 객체를 생성하면 메모리의 Heap 영역에 올라가게 된다. 그리고 Heap 영역에서 발생하는 쓰레기 값은 Garbage Collector가 자동으로 관리해준다.


하지만, static 메서드는 static 영역에 존재하므로 GC의 관리를 받지 못한다. 따라서, 프로그램이 종료될 때 메모리를 해제하게 되는데, 과도하게 많은 static을 선언하면 메모리 과부하가 올 수 있다. 그리고 너무 많은 static 메서드가 존재한다면, 시작과 동시에 에러가 날 수 있으므로 남발하는 것은 좋지 않다.



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

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

반대로, 인스턴스 메서드에서 static 변수를 사용하는 것은 아무 문제가 없다.





출처: jooona - Static? 그거 왜 붙이는건데?

profile
🌱

0개의 댓글