* 변수의 사용 범위
- 블록 바깥에서 선언 되어 있는 변수는 사용 불가능.
- 메소드의 매개변수는 메소드 블록 바깥에서 선언되어 있기는 하지만 해당 메소드 블록 내에서 사용가능.
- 메소드 내에서 선언되어 있지는 않지만 클래스 자체에서 선언되어 있는 변수는 사용가능하다.
public class VariableScopeExam {
int globalScope = 10;
static int staticVal = 7;
public void scopeTest(int value) {
System.out.println(globalScope); // globalScope 변수 사용가능
System.out.println(value); // 매개변수로 선언된 value도 가능.
}
public static void main(String[] args) {
System.out.println(globalScope); // 오류
System.out.println(staticVal); // 변수를 static 변수로 선언하면 사용가능.
}
* Static
해당 클래스(VariableScopeExam) 내 선언되어 있음에도 불구하고 globalScope를 사용 불가능.
main method가 static하기 때문.
모든 클래스는 인스턴스화 하지 않은 채로 사용할 수 없다.
-> Car라는 클래스를 만들었으면
-> Car c1 = new Car(); 로 객체화해야 사용 가능!
main은 static한 메소드. 키워드 static을 사용하면 인스턴스화 하지 않아도 사용가능.
static한 필드(필드 앞에 static 키워드를 붙힘)나, static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있다.
이것이 이제까지 main 메소드에서 클래스를 new하지 않아도 사용가능했던 이유.
그래서 static한 메소드에서는 static하지 않은 필드를 사용 할 수 없다.
static한 메소드를 사용하는 시점에 해당 클래스가 인스턴스화 되지 않았을 수도 있기 때문.
* Static 변수
VariableScopeExam v1 = new VariableScopeExam();
// new로 클래스 객체화. v1 -> 인스턴스 변수
// 인스턴스 변수(v1)는 인스턴스(VariableScopeExam)가 생성될 때 값을 저장하는 공간(v1.globalScope)이 하나가 생김.
System.out.println(v1.globalScope); // VariableScopeExam 클래스에 있는 globalScope라는 변수를 불러와.
VariableScopeExam v2 = new VariableScopeExam(); // 값을 저장하는 공간이 하나가 더 생김.(v2.globalScope)
v1.globalScope = 10;
v2.globalScope = 20;
System.out.println(v1.globalScope); // 출력 : 10
System.out.println(v2.globalScope); // 출력 : 20
v1.staticVal = 50;
v2.staticVal = 100;
System.out.println(v1.staticVal); // 출력 : 100
System.out.println(v2.staticVal); // 출력 : 100
v2(레퍼런스).staticVal(변수명)하고 사용하기 보다는 클래스 이름을 직접 사용.
VariableScopeExam.staticVal와 같이 클래스명.변수명으로 사용. static한 변수는 하나이므로.
staticVal같은 static한 필드를 클래스 변수라고 한다.
static하게 선언된 변수는 값을 저장할 수 있는 공간이 하나만 생성되기 때문에 값을 공유한다.
나중에 저장된 값이 변수에 들어간다.
그러므로, 인스턴스가 여러개 생성되도 static한 변수는 하나다.
globalScope같은 변수(필드)는 인스턴스가 생성될때 생성되기때문에 인스턴스 변수라고 한다.
'STUDY > JAVA' 카테고리의 다른 글
230401 공부기록 (0) | 2023.04.04 |
---|---|
230331 공부기록 (0) | 2023.04.01 |
230329 공부기록 (0) | 2023.03.30 |
자바파일을 String으로 저장하지 말 것. (0) | 2023.03.29 |
이클립스에서 커서가 두꺼워졌을 때 (0) | 2022.09.19 |