변수의 scope와 static
📜 변수의 스코프 : 변수를 사용 가능한 범위
변수가 선언된 블록이 그 변수의 사용 범위이다.
public class ValableScopeExam{
int globalScope = 10; // 인스턴스 변수
public void scopeTest(int value){
int localScope = 10;
System.out.println(globalScope);
System.out.println(localScpe);
System.out.println(value);
}
}
- 클래스의 속성으로 선언된 변수 globalScope 의 사용범위는 클래스 전체이다.
- 매개변수로 사용한 int value 는 블록 바깥에 존재하지만, 메소드의 선언부에 존재하므로 사용범위는 해당 메소드 블록 내이다.
- 메소드 블록 내에서 선언된 localScope변수의 사용 범위는 메소드 블록 내이다.
💡main method에서 사용하기
- 같은 클래스 안에 있는데 globalScope 변수를 사용할 수 없다.
⭐️ 이유 : main메서드는 static 한 메소드이기 때문이다. static한 메서드에서는 static 하지 않은 필드를 사용할 수 없기 때문이다.
public class VariableScopeExam {
int globalScope = 10;
public void scopeTest(int value){
int localScope = 20;
System.out.println(globalScope); // 전역변수
System.out.println(localScope); // 지역변수
System.out.println(value); // 매개변수 -> 지역변수와 동일한 스코프
}
public static void main(String[] args) {
System.out.println(globalScope); //오류
System.out.println(localScope); //오류
System.out.println(value); //오류
}
}
💡static
- 같은 클래스 내에 있음에도 해당 변수들을 사용할 수 없다.
- main 메소드는 static이라는 키워드로 메소드가 정의되어있다.
- static한 필드(필드 앞에 static 키워드를 붙힘)나, static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있다. 즉, 객체를 생성하지 않아도 해당 메서드를 호출해서 사용가능하다는 의미이다.
public class VariableScopeExam {
int globalScope = 10; // 인스턴스 변수
static int staticVal = 7; // 클래스 변수
public void scopeTest(int value) {
int localScope = 20; //지역변수
}
public static void main(String[] args) {
System.out.println(staticVal); // 클래스 변수는 인스턴스화 하지 않고도 사용가능
System.out.println(globalScope); // 오류
}
}
instance 변수는 저장 공간이 여러 곳 생기지만
class 변수 즉, static한 변수는 하나의 공간만 존재하기 때문에 저장값이 하나만 존재한다.
클래스 내에서 static 하지 않은 변수를 사용하고 싶을 때 클래스 선언부 변수 앞에 static 을 붙여주면 스태틱한 변수 사용 가능
ValableScopeExam v1 = new ValableScopeExam();
ValableScopeExam v2 = new ValableScopeExam();
v1.staticVal = 10;
v2.staticVal = 20;
// static은 값을 공유하므로 두 코드 모두 20을 출력
System.out.println(v1.statVal);
System.out.println(v2.statVal);
static 변수는 인스턴스가 아닌 클래스에 귀속이 된다.
따라서, 위의 코드처럼 인스턴스가 여러개 생성돼도 static한 변수는 딱 하나이다.
다른 예 (두개의 코드는 서로 다른 파일에 저장)
public class Car{
static int wheelCount;
}
public class StaticExam{
public static void main(String []args){
Car taxi = new Car();
Car suv = new Car();
taxi.wheelCount = 10;
suv.wheelCount = 4;
System.out.println("taxi의 바퀴수:"+ taxi.wheelCount);
System.out.println("suv의 바퀴수:"+ suv.wheelCount);
}
}
여기서는 출력값이 system.out.println("taxi의 바퀴수" + taxi.wheelCount); 와 system.out.println("suv의 바퀴수" + suv.wheelCount); 의 값이 동일하게 4로 출력될 수 밖에 없음.
소감
static 너무 어려워서 이틀 동안 진도를 전혀 못나갔다. 처음엔 강의 내용을 전혀 이해하지 못했지만 같은 강의를 여러번 듣고 또 필기도 하고, static에 대해서 다룬 다른 영상들(생활코딩)을 보며 조금씩 개념이 잡혀 완전히 이해한 것은 아니지만 어느정도 이해한 것 같다.
일단 진도는 계속 나가야하기에 이정도만 일단 이해를 하고(활용법, 사용시 주의할 점) 진도를 나간 뒤 내가 이 언어에 대해서 친숙해졌을 때 다시 생각을 정리해보고자 한다.