605161856315751
김종찬
  • 2016.7.10 19:11
  • 조회수 121
  • 답변수 1
605161856315751
김종찬
  • 2016.7.10 19:11
  • 조회수 121
  • 답변수 1

질문 있어요!!

1단계 코드인
public class VariableScopeExam{
int value = 10;
public static void main(String []args){
System.out.println(value);
}
}
에서는 non-static 한 변수인 value 를 static 한 메인 메소드에서 사용하려 했으니 오류가 납니다.

하지만 2단계 코드의 car 클래스
public class Car{
static int wheelCount;
}
에서 static을 지우고
public class Car{
int wheelCount;
}
로 수정하고 StaticExam 클래스를 수행하면
taxi의 바퀴수:10
suv의 바퀴수:4
라는 값을 잘 출력합니다

여기서 헷갈리는 점은
두 경우 모두 non-static한 변수(둘 다 static 을 붙이지 않았으니)를 사용한건데 왜 첫번째 경우는 오류가 나고 두번째 경우는 잘 작동되느냐는 점입니다.

어디서 차이가 있는건지 알려주세요 ㅜㅜ

  • #자바 입문
  • #변수의 scope와 static - 실습

1 답변

  • Spgjnhnsidwygch8ddkd
    Chandler
    • 2016.7.11 16:07

    static 변수는 알고 계신다는 가정 하에 간단하게 설명 하겠습니다.
    static 변수란 한번 생성되면 선언문을 또 만나더라도 새로 생성되지 않게하는 키워드 입니다.
    즉, 한번 메모리에 할당되면 더 이상 새로 할당되지 않게 한다는 의미입니다.

    public class VariableScopeExam{
        static int value = 10;
        public static void main(String []args){
            System.out.println(value);
        }
    }
    
    public class VariableScopeExam{
        int value = 10;
        public static void main(String []args){
            VariableScopeExam ex = new VariableScopeExam();
            System.out.println(ex.value);
        }
    }
    

    일반적으로 자바에서 변수가 메모리에 할당되는 시기는 객체가 생성되었을 때 입니다.
    두 번째 코드(static 사용 X)를 보시면
    VariableScopeExam ex = new VariableScopeExam();
    위 코드로 ex라는 객체가 만들어지는 순간 변수 value가 메모리에 할당 됩니다.

    그러나, 첫번째 코드(static 사용)의 경우는 완전 다른 동작방식으로 진행됩니다.
    클래스가 메모리에 할당 되는 순간, static으로 선언한 value도 메모리에 같이 할당되는 것 입니다.

    메모리 할당 시기를 알고 보시면 더 이해하기 쉬울 것 입니다.
    질문으로 돌아와서

    public class VariableScopeExam{
        int value = 10;
        public static void main(String []args){
            System.out.println(value);
        }
    }
    

    이 경우는 value가 아직 메모리에 할당되지 않은 상태에서 사용하려 해서 오류가 발생한 것 입니다.

    public class Car{
        int wheelCount;
    }
    
    public class StaticExam{
        public static void main(String []args){
            Car taxi = new Car(); // 메모리 할당
            Car suv = new Car(); // 메모리 할당
    
            ...
        }
    }
    

    이는 static을 붙이지 않았지만, 객체 선언 문장을 만나 메모리를 할당 받았기 때문에 오류가 발생하지 않는 것 입니다.

    한번 이해하면 그리 어렵지 않은 개념입니다. 잘 이해안되는 부분은 댓글로 남겨주세요 :)

    • 잘 이해되었네요 -정인
      2016.10.31 05:11

답변 쓰기

이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.