👩‍💻 BackEnd/☕️ 자바 [Java]

변수의 scope와 static

minhe2810 2023. 4. 14. 13:52

📜 변수의 스코프 : 변수를 사용 가능한 범위

 

변수가 선언된 블록이 그 변수의 사용 범위이다. 

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에 대해서 다룬 다른 영상들(생활코딩)을 보며 조금씩 개념이 잡혀 완전히 이해한 것은 아니지만 어느정도 이해한 것 같다. 

 

일단 진도는 계속 나가야하기에 이정도만 일단 이해를 하고(활용법, 사용시 주의할 점) 진도를 나간 뒤 내가 이 언어에 대해서 친숙해졌을 때 다시 생각을 정리해보고자 한다.