static 변수는 인스턴스가 생성될때 메모리에 올라가는 것이니라 프로그램이 프로세스가 돼서 메모리에 적재 될때 Data영역에 위치하게 되고, 프로그램이 끝나서 메모리에서 언로드 되는 순간 소멸한다. (인스턴스가 생성될때는 Heap영역에 위치한다.)
인스턴스 생성과 상관 없이 사용 가능하므로 클래스 이름으로 직접 참조할 수 있다. (ex> Employee.serialNum)
예시는 아래와 같다.
public class Employee{
public static int serialNum = 1000;
private int id;
private String name;
private String department;
public Employee(){
serialNum ++;
id = serialNum;
}
}
public class test {
public static void main(String[] args){
Employee member1 = new Employee();
Employee member2 = new Employee();
}
}
위와 같이 인스턴스들이 공통으로 가져야 할 serialNum은 static 변수로 선언해서 인스턴스들의 기준값으로 사용할 수 있다.
또한 위와 같은 코드는 아래와 같이 메모리 영역에 할당된다.
Static 메서드
클래스 메서드 라고도 한다.
public class Employee{
public static int serialNum = 1000;
private int id;
private String name;
private String department;
public Employee(){
serialNum ++;
id = serialNum;
}
public static int getSerialNum(){
return serialNum; // static 변수는 사용가능
}
public static int getName(){
return name; // 오류 발생
}
}
static 메서드는 인스턴스 생성과 무관하게 클래스 이름으로 호출 될 수 있음
인스턴스 생성 전에 호출 될 수 있으므로 static 메서드 내부에서는 인스턴스 변수를 사용할 수 없음 -> static 메서드는 인스턴스 생성과는 상관없이 사용할 수 있는데 인스턴스 변수를 사용하게 된다면, 이미 생성도 되지않은 인스턴스의 변수를 사용하는 격이 된다.
Static 응용 -> 싱글톤 패턴
싱글톤 패턴이란? -> 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴이다.
static 변수, 메서드를 활용하여 구현 할 수 있다.
예시는 아래와 같다.
public class Company{
private static Company instance = new Company();
private Company(){
}
public static Company getInstance(){
return instance;
}
}
위와 같이 작성한 코드를 싱글톤 패턴이라고 할 수 있다.
public class test {
public static void main(String[] args){
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
// 두 값 모두 같은 주소값을 출력한다.
System.out.println(company1);
System.out.println(company2);
}
}
위의 코드처럼 인스턴스를 생성하지 않고 이미 인스턴스를 사용할 수 있다. -> static이기 때문에 이미 Data영역에 적재되었기 때문이다.