-
[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(); } }
- c는 main 메서드에서 선언한 지역변수이므로 스택 메모리에 할당된다. 데이터 타입을 Count로 지정했으므로 Count 클래스의 인스턴스를 참조하는 참조변수이다.
- new Count(); 명령문은 힙 메모리에 Count 인스턴스를 할당하면서 Count 클래스에 선언한 필드를 함께 할당한다. 이때 static 키워드가 붙은 클래스 필드는 힙 메모리에 할당하지 않는다. 클래스 필드는 main() 메서드가 실행되기 전에 이미 코드 메모리에 할당했기 때문이다. 대신 Count 인스턴스는 코드 메모리에 할당된 클래스 필드의 정보를 포함한다.
- 클래스 Count의 count 필드가 할당된다.
클래스 필드를 사용할 땐, 참조변수가 필요 없다. main() 메서드가 실행되기 전에 이미 메모리에 할당되었으므로 바로 사용할 수 있다. 사용할 땐 '클래스명.필드명' 이렇게 사용한다.
클래스 메서드(정적 메서드)
메서드 선언부에 static 키워드가 선언된 메서드. 변수든 메서드든 static으로 선언하면 무조건 main() 메서드가 실행되기 전에 코드 메모리 영역에 생성된다. 자바 프로그램은 java.exe 프로그램으로 실행한다. 이 프로그램은 main() 메서드를 호출한다. 일반적으로 변수와 메서드를 사용하려면 해당 멤버가 선언된 클래스의 인스턴스를 생성해야 하지만, main() 메서드는 static 키워드가 붙어있으므로 인스턴스 생성과 무관하게 사용할 수 있는 것이다. '클래스명.메서드명'으로 사용할 수 있다.
정적 코드 블록
정적 코드 블록도 main() 메서드 실행되기 전에 딱 한 번 실행된다. 따라서 static으로 선언된 클래스 필드를 초기화하거나 프로그램이 실행될 때 먼저 처리해야 하는 작업을 정적 코드 블록에 작성한다.
정적 멤버 내에서 인스턴스 멤버를 사용할 수 없다. 정적 멤버가 생성된 시점에 인스턴스 멤버가 존재하지 않기 때문이다.
'IT > 개발(자바, 서블릿, 스프링 등)' 카테고리의 다른 글
[Java] 상속 개념과 사용법 그리고 super() 문으로 부모 인스턴스 초기화하는 방법 (0) 2019.12.09 [Java] this 키워드로 생성자 호출 (0) 2019.12.09 [Java] 자바의 메모리 구조 정리 (0) 2019.12.07 [Java] 클래스 객체 인스턴스 용어 정리 (0) 2019.12.07 [Java] 가변 길이 인자 개념과 사용법 (0) 2019.12.07