Static 변수란?
- 여러 인스턴스에서 공통으로 사용하는 변수이다.
- 여러 인스턴스가 공유하는 기준 값이 필요한 경우 주로 사용된다.
- 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영역에 적재되었기 때문이다.
- 또한 프로그램에서 유일한 인스턴스기 때문에 주소값도 동일한 것을 확인할 수 있다.
'Java' 카테고리의 다른 글
String,StringBuilder,StringBuffer (0) | 2022.02.26 |
---|---|
Stream (0) | 2022.02.26 |
Optional (0) | 2022.02.26 |
Object 클래스 (0) | 2022.02.26 |
Exception (0) | 2022.02.26 |