ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 정적 멤버 개념 (static 키워드 개념)
    IT/개발(자바, 서블릿, 스프링 등) 2019. 12. 9. 17:05

    클래스의 모든 인스턴스가 공유하는 멤버를 정적 멤버라고 한다. 특정 인스턴스만 사용하는 것이 아니라 해당 클래스로 생성한 모든 인스턴스가 공유하는 멤버다. static 키워드를 이용한다. 프로그램이 시작될 때 메모리에 딱 한 번 코드 영역에 할당되며 프로그램이 종료될 때까지 유지된다. 이 키워드는 변수나 메서드를 선언할 때 특정 코드 블록 앞에 선언할 수 있다.

     

    클래스 필드(정적 필드)

    구분 메모리 할당 시점 메모리 할당 위치 메모리 해제 시점
    인스턴스 필드 인스턴시 생성 시 힙 메모리 인스턴스 소멸 시
    클래스 필드 프로그램 시작 시 코드 메모리(메서드 영역) 프로그램 종료 시

     

    
    
    class Count{
    	public static int totalCount;
        int count;
    }
    
    public class CountTest{
    	public static void main(String[] args){
    		Count c = new Count();
    	}
    }

     

     

    1. c는 main 메서드에서 선언한 지역변수이므로 스택 메모리에 할당된다. 데이터 타입을 Count로 지정했으므로 Count 클래스의 인스턴스를 참조하는 참조변수이다. 
    2. new Count(); 명령문은 힙 메모리에 Count 인스턴스를 할당하면서 Count 클래스에 선언한 필드를 함께 할당한다. 이때 static 키워드가 붙은 클래스 필드는 힙 메모리에 할당하지 않는다. 클래스 필드는 main() 메서드가 실행되기 전에 이미 코드 메모리에 할당했기 때문이다. 대신 Count 인스턴스는 코드 메모리에 할당된 클래스 필드의 정보를 포함한다.
    3. 클래스 Count의 count 필드가 할당된다.

     

    클래스 필드를 사용할 땐, 참조변수가 필요 없다. main() 메서드가 실행되기 전에 이미 메모리에 할당되었으므로 바로 사용할 수 있다. 사용할 땐 '클래스명.필드명' 이렇게 사용한다. 

     

    클래스 메서드(정적 메서드)

     

    메서드 선언부에 static 키워드가 선언된 메서드. 변수든 메서드든 static으로 선언하면 무조건 main() 메서드가 실행되기 전에 코드 메모리 영역에 생성된다. 자바 프로그램은 java.exe 프로그램으로 실행한다.  이 프로그램은 main() 메서드를 호출한다. 일반적으로 변수와 메서드를 사용하려면 해당 멤버가 선언된 클래스의 인스턴스를 생성해야 하지만, main() 메서드는 static 키워드가 붙어있으므로 인스턴스 생성과 무관하게 사용할 수 있는 것이다. '클래스명.메서드명'으로 사용할 수 있다.

     

    정적 코드 블록

    정적 코드 블록도 main() 메서드 실행되기 전에 딱 한 번 실행된다. 따라서 static으로 선언된 클래스 필드를 초기화하거나 프로그램이 실행될 때 먼저 처리해야 하는 작업을 정적 코드 블록에 작성한다.

     

    정적 멤버 내에서 인스턴스 멤버를 사용할 수 없다. 정적 멤버가 생성된 시점에 인스턴스 멤버가 존재하지 않기 때문이다.

Designed by Tistory.