staticstatic이란?static은 클래스(Class)에 속하는 변수나 메서드를 의미한다.
일반 변수(인스턴스 변수)는 객체마다 각각 생성되지만, static 변수는 클래스에 하나만 생성되어 모든 객체가 함께 공유한다.
예를 들어 사람(Person) 객체가 생성될 때마다 생성된 사람 수를 세고 싶다면 static 변수를 사용할 수 있다.
public class PersonWithStatic {
public static int count = 0;
private String name;
public PersonWithStatic(String name) {
this.name = name;
count++;
}
}
count는 static 변수이므로 객체가 아닌 클래스에 하나만 존재한다.count++가 실행된다.public class PersonWithStaticDemo {
public static void main(String[] args) {
System.out.println("객체 생성 이전 : " + PersonWithStatic.count);
PersonWithStatic p1 = new PersonWithStatic("철수");
PersonWithStatic p2 = new PersonWithStatic("영희");
System.out.println("객체 생성 이후 : " + PersonWithStatic.count);
System.out.println(PersonWithStatic.count);
}
}
객체 생성 이전 : 0
객체 생성 이후 : 2
2
가능은 하지만 권장되지 않는다.
System.out.println(p1.count);
위 코드는 실행은 되지만 다음과 같은 경고가 발생한다.
"static 필드는 클래스 이름으로 접근하세요."
권장하는 방법은 다음과 같다.
System.out.println(PersonWithStatic.count);
즉, static은 객체가 아니라 클래스의 변수이므로 클래스 이름으로 접근하는 것이 올바른 방법이다.
예를 들어 학생 객체를 100개 생성했다고 가정해 보자.
Student s1 = new Student();
Student s2 = new Student();
Student s3 = new Student();
학생 수를 세는 변수(count)가 일반 변수라면 객체마다 따로 생성된다.
s1.count = 1
s2.count = 1
s3.count = 1
이렇게 되면 전체 학생 수를 알 수 없다.
하지만 static을 사용하면 하나의 변수를 모든 객체가 공유하므로,
Student.count = 3
처럼 전체 객체의 개수를 쉽게 관리할 수 있다.
| 일반 변수(인스턴스 변수) | static 변수(클래스 변수) |
|---|---|
| 객체마다 생성된다. | 클래스에 하나만 생성된다. |
| 객체마다 다른 값을 가진다. | 모든 객체가 같은 값을 공유한다. |
| 객체를 생성해야 사용할 수 있다. | 객체 생성 없이 사용할 수 있다. |
| 객체명으로 접근한다. | 클래스명으로 접근한다. |
static필드는 클래스에 하나만 생성되어 모든 객체가 공유하는 변수이다. 객체를 생성하지 않아도 클래스 이름으로 접근할 수 있으며, 공통으로 사용하는 데이터를 저장할 때 사용한다.