static
변수는 정적변수 라고도 하며, 어떤 변수를 여러 클래스에서 공통으로 사용할 때 이용한다. 클래스 내부에 선언하며, static
예약어를 사용한다.
static int serialNum;`
static
변수는 인스턴스가 생성될 때마다 새로 생성되는 변수가 아니다. 프로그램이 실행되어 메모리에 적재됐을 때 한 번 메모리 공간이 할당된다. 그리고 이 값은 모든 인스턴스가 공유한다.
static 변수는 인스턴스 생성과는 별개이므로 인스턴스보다 먼저 생성된다. 그러므로 인스턴스가 아닌 클래스 이름으로도 참조하여 사용할 수 있다. 그래서 자바에서는 static변수를 클래스 변수
라고도 한다.
일반 멤버 변수를 위한 메서드가 존재하듯이 static 변수를 위한 메서드도 있다. 이를 static 메서드
또는 클래스 메서드
라고 한다.
주의할 점 ! static 메서드 내부에서는 인스턴스 변수를 사용할 수 없다.
아래 예제를 보면 getSerialNum()
의 두번째 줄에서 에러가 발생한다.
public class Student2 {
private static int serialNum = 1000;
//static 변수
int studentID;
String studentName;
int grade;
String address;
public static int getSerialNum() { //static 메서드
int i=10; //지역변수이기 때문에 사용 가능
studentName = "총총"; //인스턴스 변수이기 때문에 사용 불가
return serialNum; //static 변수이기 때문에 사용 가능
}
}
오류가 발생하는 이유는 studentName은 Student2클래스의 멤버변수로, 인스턴스가 생성될 때 만들어지는 인스턴스 변수이기 때문이다!
싱글톤 패턴이란, 디자인 패턴의 종류 중 하나로 static을 응용하여 프로그램 전반에서 사용하는 인스턴스를 하나만 구현하는 방식이다.
다음은 싱글톤 패턴을 구현하는 예제이다.
디폴트 생성자의 접근제어자는 항상 public
이므로 이를 private
로 변경해야 한다. 접근제어자가 public
이면 외부에서 인스턴스를 맘대로 생성할 여지가 있기 때문이다.
public class Company {
private Company() {} //생성자
}
이제 접근제어자가 private이므로 외부에서 인스턴스를 생성할 수 없다. 하지만 사용할 인스턴스가 하나 필요하므로 여기서 유일한 인스턴스를 생성한다. 또, 이 인스턴스를 private로 선언해야 외부에서 함부로 접근하려는 시도를 막을 수 있다.
public class Company {
private static Company instance = new Company(); //유일하게 생성한 인스턴스
private Company() {} //생성자
}
private로 선언한 유일한 인스턴스를 외부에서 사용할 수 있게 하려면 public 메서드를 선언해야 한다. 인스턴스를 반환하는 메서드는 반드시 static으로 선언해야 한다. 왜냐하면 getInstance()메서드는 인스턴스 생성과 관계 없이 호출할 수 있어야 하기 때문이다.
public class Company {
private static Company instance = new Company(); //유일하게 생성한 인스턴스
private Company() {} //생성자
public static Company getInstance() {
if (instance == null) {
instance = new Company();
}
return instance;
}
}
이제 외부 클래스에서 유일하게 생성된 인스턴스를 가져와 사용하면 된다
Company myCompany = Company.getInstance();