Java/Java 기초
[Java 기초] 변수의 Scope와 static
메성
2019. 12. 31. 23:42
반응형
변수의 Scope와 static
변수가 선언된 블럭이 해당 변수의 사용범위이다
public class ValueScope{
int global = 0;
public int func(int val) {
int local = 1;
}
}
- 클래스 속성의 변수
- global 변수로서, ValueScope 전체 범위가 해당 변수의 Scope이다.
- 매개변수로 선언된 변수
- val 변수로서, func 메소드 블럭만이 해당 변수의 Scope이다.
- 메소드 블럭 내에 선언된 변수
- local 변수로서, 매개변수와 마찬가지로 func 메소드의 블럭만이 해당 변수의 Scope이다.
static
공유 자원이며, 객체가 인스턴스화 되지 않아도 호출하여 사용할 수 있는 특징을 가지고 있다.
좀 더 자세한 설명을 봐보자
메모리 할당 지역 및 실행 시점
- static의 메모리 할당 지역은 어디일까? 그곳은 바로 클래스 영역(메소드 영역)이다.
- 그럼 왜 static은 객체가 인스턴스화 되지 않아도 사용이 가능하지?
- 보통 프로그램이 실행하면 필요한 클래스가 JVM 메모리상에 로딩되는 과정을 거치게 된다. 그리고 한번 로딩된 클래스는 별 이상이 없지 않는 한, 객체를 생성할 수 있도록 메모리에 위치하게 된다. static은 이 시점에서 메모리에 올라가 동작 처리하는 것이다.
- 그렇다면 왜 공유자원이 되는 것이지?
- JVM 메모리상에 로딩이 되는 과정에서 static 뿐만 아니라, 클래스, 변수, 메소드, 상수 pool를 클래스 영역에 올라가 있고, 해당 영역은 모든 스레드가 공유하는 영역이기 때문이다.
주 목적
- 클래스를 설계할 때 다른 클래스에서도 자원을 공통적으로 사용하고자 할 때 static을 사용한다.
- 만약 메서드 내에서 인스턴스 변수를 사용하지 않는다면, 해당 메서드를 static 메서드로 변경하는 것을 고려하는 것이 좋다.
- why? static 메서드는 인스턴스 메서드보다 호출시간이 짧기 때문이다(인스턴스 메서드는 실행 할 때 호출되어야하는 메서드를 찾는 시간이 더 걸린다.)
static 주의
static 메서드를 사용할 때, 인스턴스 변수를 사용할 수 없다.
- 인스턴스 변수 사용시 해당 인스턴스가 메모리에 올라가 있지 않으니깐!
클래스 멤버와 인스턴스 멤버를 혼용하여 사용할 시 주의해야한다.
class test{ static int a = 10; int b = 20; static int c = b; //에러 발생 //c(클래스 멤버)가 할당 받는 b(인스턴스 멤버)는 인스턴스가 생성되어야지만 존재하는 값이기 때문이다. }
반응형