[JAVA] static 변수와 static 메서드
자바 클래스의 선언 위치에 따른 변수
- 인스턴스 변수(Instance variable, iv)
- 클래스 변수(Class variable, cv)
- 지역 변수(Local variable, lv)
클래스의 변수는 위와 같이 세 가지로 구분할 수 있다. 그중 static 키워드가 붙는 변수를 클래스 변수라고 한다.
세 변수에 대한 정의는 다음과 같다.
class Variable {
int iv = 0; //인스턴스 변수
static int cv = 0; //클래스 변수
void method() {
int lv = 0; //지역 변수
}
}
1. 인스턴스 변수(Instance variable, iv)
인스턴스 변수는 클래스 영역에 선언되고 인스턴스가 생성될 때 만들어진다.
2. 클래스 변수(Class variable, cv)
클래스 변수도 인스턴스 변수와 마찬가지로 클래스 영역에 있지만 static 키워드를 붙여서 클래스 변수로 선언된다.
3. 지역 변수(Local variable, lv)
지역 변수는 메서드 안에 선언되고 메서드가 끝나면 소멸된다. 지역 변수는 항상 초기화시켜줘야 한다.
변수 | 선언위치 | 생성시기 |
클래스변수 | 클래스 영역 | 클래스가 메모리에 저장될 때 |
인스턴스 변수 | 인스턴스 생성 시 | |
지역변수 | 클래스 영역을 제외한 영역 | 해당 영역의 코드가 수행될 때 |
static?
static은 정적인, 고정된이란 뜻이다. 즉, 앞에서 알아본 static 키워드를 붙여 선언하는 클래스 변수(cv)는 정적인 변수, 고정된 변수라는 뜻이다. 이러한 변수는 인스턴스가 생성될 때 저장되는 Heap area가 아닌 Method area에 클래스가 올라갈 때 같이 올라가고 생성되는 인스턴스들은 다 같은 클래스 변수를 공유한다.
static 변수
클래스 변수는 클래스가 메모리에 올라갈 때 같이 올라가기 때문에 인스턴스를 생성하지 않고도 변수에 접근할 수 있다.
class Variable {
int iv = 0; //인스턴스 변수
static int cv = 0; //클래스 변수
void method() {
int lv = 0; //지역 변수
}
}
public class VariableTest {
public static void main(String[] args) {
System.out.println(Variable.cv); // 클래스 변수 출력 0
//System.out.println(Variable.iv); // 에러
}
}
인스턴스를 생성하고 인스턴스 변수를 변경하면 각 인스턴스 변수는 각각 다른 값을 갖지만 클래스 변수를 변경하면 모든 인스턴스들의 클래스 변수는 동일한 값을 갖는다. 클래스 변수에 접근할 때는 참조 변수를 사용하지 말고 참조 타입을 사용하자.
public class VariableTest {
public static void main(String[] args) {
Variable v1 = new Variable();
Variable v2 = new Variable();
v1.iv = 1;
v2.iv = 2;
System.out.println("v1.iv = " + v1.iv); //v1.iv = 1
System.out.println("v2.iv = " + v2.iv); //v2.iv = 2
v1.cv = 1;
v2.cv = 2;
System.out.println("v1.cv = " + v1.cv); //v1.cv = 2
System.out.println("v2.cv = " + v2.cv); //v2.cv = 2
System.out.println("Variable.cv = " + Variable.cv); //Variable.cv = 2
}
}
static 메서드
static 메서드도 클래스 변수와 기본적으로 동일하다. 즉, static 메서드도 클래스가 메모리에 올라갈 때 같이 올라간다.
주의할 점은 static 메서드는 인스턴스 변수를 사용하지 못한다.
인스턴스 변수는 인스턴스가 생성되어야 사용할 수 있는데 static 메서드는 인스턴스 생성 없이 사용할 수 있기 때문에 static 메서드의 바디에는 인스턴스 변수가 존재하면 안된다. 반대로 인스턴스 메서드는 클래스 변수를 사용할 수 있다.
class MyMethod {
int iv = 1;
static int cv = 2;
void instanceMethod() {
System.out.println("instance method iv = " + iv + " cv = " + cv);
}
static void staticMethod() {
// System.out.println("instance Method iv = " + iv + " cv = " + cv); //에러!! static 메서드는 iv를 사용할 수 없다.
System.out.println("static method cv = " + cv);
}
}
public class MethodTest {
public static void main(String[] args) {
MyMethod m = new MyMethod();
m.instanceMethod(); //instance method iv = 1 cv = 2
m.staticMethod(); //static method cv = 2
MyMethod.staticMethod(); //static method cv = 2
}
}
static 메서드와 static 변수 활용
class MyMethod {
static int count = 0;
MyMethod() {
count++;
}
static void printCount() {
System.out.println(count);
}
}
public class MethodTest {
public static void main(String[] args) {
MyMethod m1 = new MyMethod(); //count++
MyMethod m2 = new MyMethod(); //count++
MyMethod.printCount(); //2
}
}
'Programming > Java' 카테고리의 다른 글
[JAVA] 객체지향 프로그래밍(OOP) - 캡슐화 (0) | 2022.09.07 |
---|---|
[JAVA] 객체지향 프로그래밍(OOP) - 상속 (1) | 2022.09.07 |
[JAVA] 생성자(Constructor) (0) | 2022.09.06 |
[JAVA] 클래스와 객체 (0) | 2022.09.05 |
[JAVA] 배열 복사하는 방법 (0) | 2022.09.02 |