코딩항해기

[JAVA] static, static 블록 본문

JAVA

[JAVA] static, static 블록

miniBcake 2024. 7. 2. 17:45

 

 

스태틱 static

정적인의 의미를 갖고 있으며, 객체와 무관하게 프로그램에 종속되어있다.

자바의 저장공간이 프로그램이 시작되고 끝날 때까지 계속 유지된다면 정적이다.

(프로그램 실행 도중에 생기거나 사라질 수 있다면 동적이다.)

 

static 생성과 종료 시점

프로그램은 실행시키면 그 프로그램이 실행되는데 필요한 정보를 JVM안에 클래스로더가

작성한 코드가 실행되기 직전에 읽어들이고 다 읽고 나면 실행된다.

static이 붙은 멤버는 클래스 정보를 읽어오는 시점에 미리 만들어진다.

실행과 동시에 만들어져 method 영역에 저장되어 있는 static 저장공간은

프로그램이 종료되어야만 메모리에서 사라진다.


[static 키워드에 따른 변수/메소드 호칭 차이]

변수 static O static 변수, 클래스 변수, 정적 변수 ...
static X 인스턴스 변수 ...
메소드 static O static 메소드, 클래스 메소드, 정적 메소드 ...
static X 인스턴스 메소드 ...

 

 

static 생성과 호출

static 생성은 타입, 메소드의 경우 리턴타입(접근제한자) 앞에 static을 붙여 선언하면 된다.상수(final이 붙어있는 경우)는 final 앞에 작성하면 된다.

static 멤버와 instance 멤버 static 변수, static 메소드는 객체를 생성하지 않아도 사용할 수 있다.

 

static 변수 호출의 경우,

클래스명.static변수명;

 

static 메소드 호출의 경우,

static메소드명(인수);

 

static 변수는 객체와 상관없이 하나의 저장공간이므로 모든 객체가 공유해서 사용한다.

즉, 모든 객체에서 공통으로 사용되는 변수에 static을 붙이는 것을 고려하여야한다.

또한 static 변수는 생성자에서 초기화 하지 않는다. (클래스 필드에서 바로 초기화하거나, static 블록 사용)

 

static 메소드 주의점

static 메소드에는 인스턴스 멤버를 사용할 수 없다.

프로그램이 실행되어 static 메소드가 메모리에서 사용 준비가 끝나도,

인스턴스 멤버는 new를 사용하여 객체를 생성하기 전까지 사용할 수 없기 때문이다.

 

static 사용

정적메소드(클래스메소드, 스태틱메소드) 객체를 생성하지 않아도

호출 가능하기에 주로 유틸리티 메소드나 공통동작 구현할 때 사용된다.


정적변수(클래스변수, 스태틱변수) 클래스의 모든 인스턴스에서 동일한 값을 공유하거나,

객체 간의 정보 공유할 때 사용된다.

 


정적 블록 static block (클래스 블록, 스태틱 블록)

정적블록은 클래스가 로드될 때 실행되는 블록으로, 정적멤버를 초기화하는데 사용된다.

모든 인스턴스가 생성되기 이전에 실행되기 때문에 초기화 작업에 유리하다.


클래스가 메모리에 로드되는 시점

1. 클래스에 객체가 생성될 때(클래스 인스턴스화)
2. 클래스의 정적멤버(변수나 메소드)에 접근할 때
3. 클래스를 사용하는 다른 클래스가 로드될 때 (참조하려는 클래스에 의존성이 있는 경우)

 

정적 블록이 메모리에 로드되는 시점

모든 인스턴스가 생성되기 이전에 클래스가 처음으로 로드될 때 실행

package staticTest;

public class StaticBlock {
	static {
		//클래스 로드시에 실행되는 정적 블록
		System.out.println("클래스가 로드 될 때 이 블록이 실행된다");
	}
	
	public static void main(String[] args) {
		System.out.println("메인메소드 실행");
		//staticblock 클래스가 로드될 때 정적블록내의 코드가 먼저 실행되고
		//메인메소드의 코드가 실행됨
		//클래스 로드 시 한 번 실행되는 것이 특징
		
	}
}