정적(static)은 고정된이란 의미를 가지고 있습니다. Static이라는 키워드를 사용하여 Static변수와 Static메소드를 만들 수 있는데 다른말로 정적필드와 정적 메소드라고도 하며 이 둘을 합쳐 정적 멤버라고 합니다. (클래스 멤버라고도 합니다.) 정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버입니다. 그렇기에 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할때 클래스별로 관리됩니다. 따라서 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있습니다.

Static 키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 Static영역에 할당됩니다.
Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가지지만 Garbage Collector의 관리 영역 밖에 존재하기에 Static영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 됩니다.
그렇기에 Static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 악영향을 줄 수 있습니다.
package jun;
class StaticTest{
/*
★ static - 클래스변수
1. 메모리 static 영역에 1번만 생성된다. → 초기화 1번만 수행
★★★모든 객체가 공유한다.(공유변수)★★★
2. static메소드에서는 static변수만 사용 가능
static메소드에서는 this를 참조할 수 없다
3. static변수나 메소드는 호출시 클래스명으로 직접 호출 할 수 있다.
객체로도 호출이 가능하다
4. static{ } - 초기화 영역
- 생성자보다도 먼저 수행한다.
*/
private int a; //필드, 인스턴스 변수(객체 생성 후에만 사용이 가능, 객체가 소멸되면 인스턴스 변수도 없어진다.)
private static int b; //필드, 클래스 변수
static { //static block : 클래스가 메모리에 로드될 때 한 번만 실행되는 문장들의 집합이다, 일반적으로 정적 변수들을 초기화하는 용도로 많이 사용된다.
System.out.println("초기화 영역");
StaticTest.b=5;
}
public StaticTest() {
System.out.println("기본 생성자");
this.a=5;
}
public void calc() {
a++;
b++;
}
public void disp() {
System.out.println("a = "+this.a+" b = "+this.b);
} //StaticTest.b
public static void output() {
System.out.println("static method...");
//System.out.println("a = "+a+" b = "+b); //error(static메소드안에서는 static 변수만 사용 가능)
}
}
public class StaticMain {
public static void main(String[] args) {
StaticTest aa = new StaticTest();
aa.calc();
aa.disp();
System.out.println();
StaticTest bb = new StaticTest();
bb.calc();
bb.disp();
System.out.println();
StaticTest cc = new StaticTest();
cc.calc();
cc.disp();
System.out.println();
StaticTest.output(); //클래스명.메소드()
aa.output(); //객체.메소드()
}
}
/*
초기화 영역
기본 생성자
a = 6 b = 6
기본 생성자
a = 6 b = 7
기본 생성자
a = 6 b = 8
static method...
static method...
*/
간단하게 static 상수 또는 메소드를 호출할 때 사용
package jun;
//import static java.lang.Math.random;
//import static java.lang.Math.pow;
import static java.lang.Math.*; //wild card(* : 모든 것)
import static java.lang.String.format;
import static java.lang.System.out;
public class ImportStatic {
public static void main(String[] args) {
out.println(random());
out.println(pow(2, 5)); //2의 5승
out.println(format("%.2f", 45.5678));
}
}