변수의 스코프와 라이프타임
변수에 접근하고 접근할 수 있는 영역을 스코프라고 한다.
변수는 중괄호 { } 블록 내에서 선언되고 사용된다.
변수가 선언된 위치에 따라 세 가지 영역으로 나눌 수 있다.
- Local Variable (지역 변수)
- Instance Variable (멤버 변수)
- Class Variable ( static 변수)
Local Variable (지역 변수)
지역 변수란 말 그대로 정해둔 지역에서 사용가능한 변수를 의미한다.
여기서 지역이란 함수(Method) 내부에 선언하고 메서드 밖에서는 사용할 수 없다.
하나의 지역에서 선언한 지역 변수는 그 지역을 벗어나면 사용할 수 없다.
함수를 호출하면 스택(Stack) 메모리에 생성된다. 함수가 종료되면 스택이 사라지고, 그 안에 있던 변수들은 사라진다.
어떤 지역과 다른 지역의 변수이름이 같아도 각각 다른 변수로 인식한다. 선언한 지역이 다르므로 메모리에 설정된 변수의 저장공간이 달라 서로 다른 메모리를 점유하고 있는 것이다. 함수가 호출되서 실행을 마치고 값을 반환하면 (return) 그 지역의 메모리는 해제된다. 함수의 수행이 끝나고 지역변수는 사용 할 수 없다.
라이프 타임은 변수가 선언되고 해당 블록을 벗어날 때 까지이다.
Instance Variable (멤버 변수)
멤버 변수는 new 키워드로 인스턴스를 생성시 같이 생성된다. 힙(Heap) 메모리에 생성되며 멤버 변수는 해당 클래스의 메서드에서 사용이 가능하다. 접근제어자가 public 이면 같은 패키지의 다른 클래스에도 사용 가능하다. 힙 메모리에 생성된 인스턴스는 자바의 가비지 컬렉터(Garbage Colllector)에 의해 어느 시점에 수거된다.
멤버 변수를 private 으로 하면 다른 클래스에서는 접근이 제한된다. 다른 클래스에서 private 멤버 변수를 사용하려면 getter와 setter 처럼 그 클래스의 메서드에 간접적으로 접근하여 사용하기에 데이터의 보안성이 좋아진다.
멤버 변수는 클래스 안에 있지만 인스턴스를 생성하기 전에는 사용할 수 없다.
라이프 타임은 Instance가 생성되고 해제될 때까지 즉 Instance가 메모리에 살아있는 동안이다.
Class Variable (static 변수)
static 예약어를 붙이면 사용할 수 있고 프로그램 실행시 클래스를 메모리에 로드했을 때부터 생성되는 변수이다.
인스턴스를 new로 생성하거나 하지 않아도 사용할 수 있고 데이터 영역에 생성된다.
프로그램 실행 ~ 종료 시까지 계속 메모리를 점유하기 때문에 남발하면 시스템의 메모리를 낭비할 수 있으므로 사용에 주의가 필요하다.
public과 함께 사용하면 전역변수가 된다.
static 변수는 프로그램 실행시 클래스를 메모리에 로드했을 때 부터 생성된다. 미리 생성되있기에 속도는 빠르지만 프로그램이 종료될 때 까지 메모리에서 해제되지 않는다. static 변수를 많이 쓰면 시스템의 메모리가 그만큼 줄어드니 주의할 필요가 있다. 다른 변수들은 실행도중 메모리를 할당하고 해제 하지만 static은 그렇지 않다.
그렇다면 static 변수는 어떤 상황에서 사용해야 할까?
예를 들어 100개의 인스턴스가 있고 그 중에서 항상 같은 값이 중복되는 멤버 변수가 있다면 데이터가 100개가 중복되고 있을 것이다.
이런 경우 100개를 메모리에 할당하고 해제하는 시간보다 static에 올려서 쓰는 것이 훨씬 효율적이다.
라이프 타임은 프로그램이 실행되고 종료될 때 까지이다.
'Language > JAVA' 카테고리의 다른 글
2주차 과제 : 프리미티브 타입과 레퍼런스 타입 (0) | 2021.02.13 |
---|---|
2주차 과제 : 프리미티브 타입의 종류와 값의 범위 그리고 기본값 (0) | 2021.02.13 |
2주차 과제 : 리터럴 (0) | 2021.02.13 |
2주차 과제 - 변수 선언 및 초기화하는 방법 (0) | 2021.02.13 |
4주차 과제: 제어문 과제 (0) | 2021.02.11 |