변수의 유효 범위
자바에서는 크게 세 가지 종류의 변수가 존재한다. 첫 번째는 메서드 내에서만 사용할 수 있는 지역 변수(로컬 변수, local variable), 클래스 안에서 사용하는 멤버 변수(인스턴스 변수, instance variable), 그리고 여러 인스턴스에서 공통으로 사용할 수 있는 static 변수(클래스 변수, class variable)이다. 변수는 어느 위치에 어떻게 선언되느냐에 따라 유효 범위(scope)가 달라진다.
지역 변수의 유효 범위
지역 변수는 메서드 내부에 선언하기 때문에 메서드 밖에서는 사용할 수 없는 특징을 가지고 있다. 즉 하나의 메서드에 선언한 지역 변수는 다른 메서드에서 사용할 수 없다. 지역 변수는 스택(stack) 영역에 생성되며, 스택에 생성되는 지역 변수는 메서드가 호출될 때 생성되었다가 반환되면 할당되었던 메모리 공간이 해제되면서 함께 없어진다.
멤버 변수의 유효 범위
멤버 변수는 클래스가 생성될 때 힙(heap) 영역에 생성되며, 클래스의 어느 메서드에서나 사용할 수 있다. 힙에 생성된 인스턴스가 가비지 컬렉터(garbage collector)에 의해 수거되면 메모리에서 사라진다. 따라서 클래스 내부의 여러 메서드에서 사용할 변수는 멤버 변수로 선언하는 것이 좋다.
static 변수의 유효 범위
사용자가 프로그램을 실행하면 메모리에 프로그램이 상주하게 되는데, 이 때 프로그램 영역 중 데이터 영역에 상수나 문자열, static 변수가 생성된다. 인스턴스 변수는 객체가 생성되는 문장, 즉 new가 되어야 생성되지만 static 변수는 클래스 생성과 상관 없이 처음부터 데이터 영역에 생성된다. 따라서 인스턴스 변수와 static 변수는 사용하는 메모리가 다르다. static 변수는 private 지시자를 사용한 것이 아니라면 클래스 외부에서도 객체 생성과 무관하게 사용할 수 있다. 프로그램 실행이 끝난 뒤 메모리에서 내려가면 static 변수도 소멸된다. static 변수는 프로그램이 시작할 때부터 끝날 때까지 메모리에 상주하므로 크기가 너무 큰 변수를 static으로 선언하는 것은 지양해야 한다.
변수 유형에 따른 용도
변수 유형 | 선언 위치 | 사용 범위 | 메모리 | 생성과 소멸 |
지역 변수 (로컬 변수) |
메서드 내부 | 메서드 내부에서만 사용 가능 | 스택(stack) | 메서드가 호출될 때 생성되고 끝나면 소멸 |
멤버 변수 (인스턴스 변수) |
클래스 내부 | 클래스 내부에서 사용하고 private 지시자를 사용한 것이 아니면 참조 변수로 다른 클래스에서 사용 가능 | 힙(heap) | 인스턴스가 생성될 때 힙 영역에 생성되고 가비지 컬렉터가 메모리를 수거할 때 소멸 |
static 변수 (클래스 변수) |
클래스 내부 (static 예약어 사용) |
클래스 내부에서 사용하고 private 지시자를 사용한 것이 아니면 클래스 이름으로 다른 클래스에서 사용 가능 | 데이터 영역 | 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸 |
정리
변수는 특성에 맞게 선언하여 사용하는 것이 중요하다. 클래스의 여러 메서드에서 사용할 변수를 지역 변수로 선언하면 다른 메서드에서 변수를 사용해야 할 때 지역 변수를 메서드의 매개변수로 전달해야 하므로 번거롭다. 그렇다고 모든 변수를 멤버 변수나 static 변수로 선언하게 되면 메모리가 낭비되고 코드의 가독성도 떨어지게 된다. 따라서 용도에 따라 변수의 유형을 명확히 정하여 효율적으로 프로그래밍을 하는 것이 좋다.
'프로그래밍 > Java' 카테고리의 다른 글
예외처리(Exception Handling)란? (0) | 2021.11.14 |
---|---|
다형성(polymorphism)의 개념 (0) | 2021.05.22 |