Programming

; develop a program

Back-End/Java

[Java] 변수 유효 범위

Clloud_ 2023. 2. 3. 08:59
반응형

이번 포스팅에서는 자바(Java)에서 변수 유효 범위에 대하여 공부를 해보고자 한다.

 


변수 유효 범위란

변수는 어디에 어떻게 선언되느냐에 따라 유효 범위(scope)가 달라진다.

  • 지역 변수(로컬 변수, local variable): 함수나 메서드 안에서만 사용할 수 있는 변수
  • 멤버 변수(인스턴스 변수, instance variable): 클래스 안에서 사용하는 변수
  • static 변수(클래스 변수, class variable): 여러 인스턴스에서 공통으로 사용할 수 있는 변수

 

지역 변수의 유효 범위

  • 함수나 메서드 내부에 선언하기 때문에 함수 밖에서는 사용할 수 없다.
  • 하나의 함수에 선언한 지역 변수는 다른 함수에 사용할 수 없다.
  • 지역 변수가 생성되는 메모리를 스택(stack)이라고 한다.
  • 스택에 생성되는 지역변수는 함수가 호출될 때 생성되었다가 함수가 반환되면 할당되었던 메모리 공간이 해제되면서 함께 없어진다.

 

멤버 변수의 유효 범위

  • 클래스가 생성될 때 힙(heap) 메모리에 생성되는 변수이다.
  • 클래스의 어느 메서드에서나 사용할 수 있다.
  • 힙에 저장된 인스턴스가 가비지 컬렉터(garbage collector)에 의해 수거되면 메모리에서 사라진다.
  • 클래스 내부의 여러 메서드에서 사용할 변수는 멤버 변수로 선언하는 것이 좋다.

 

static 변수의 유효 범위

  • 프로그램 영역 중에 데이터 영역이 있는데, 이 영역에서는 상수나 문자열, static 변수가 생성된다.
  • 인스턴스 변수는 객체가 생성되는 문장 즉 new가 되어야 생성되지만, static 변수는 클래스 생성과 상관없이 처음부터 데이터 영역 메모리에 생성된다.
  • 따라서 인스턴스 변수와 static 변수는 사용하는 메모리가 다르다.
  • private가 아니라면 클래스 외부에서도 객체 생성과 무관하게 사용할 수 있다.
  • static 변수는 프로그램이 시작할 때부터 끝날 때까지 메모리에 상주하므로 크기가 너무 큰 변수를 static으로 선언하는 것은 좋지 않다.

 


변수 유형에 따른 용도

세 가지 변수를 표로 정리하면 다음과 같다.

변수 유형 선언 위치 사용 범위 메모리 생성과 소멸
지역 변수
(로컬 변수)
함수 내부에 선언 함수 내부에서만 사용 스택 함수가 호출될 때 생성
함수가 끝나면 소멸
멤버 변수
(인스턴스 변수)
클래스 멤버 변수로 선언 클래스 내부에서 사용
private가 아니면 참조 변수로 다른 클래스에서 사용 가능
인스턴스가 생성될 때 힙에 생성
가비지 컬렉터가 메모리를 수거할 때 소멸
static 변수
(클래스 변수)
static 예약어를 사용하여 클래스 내부에 선언 클래스 내부에서 사용
private가 아니면 클래스 이름으로 다른 클래스에서 사용 가능
데이터 영역 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성
프로그램이 끝나고 메모리를 해제할 때 소멸

 

변수는 특성에 맞게 선언해서 사용하는 것이 중요하다.

  • 클래스의 여러 메서드에서 사용할 변수를 지역 변수로 선언하면 다른 메서드에서 그 변수를 사용해야 할 때 지역 변수를 메서드의 매개 변수로 전달해야 하므로 번거롭다.
  • 모든 변수를 멤버 변수나 static 변수로 선언하면 메모리가 낭비되고 코드의 가독성도 떨어진다.
  • 따라서 용도에 따라 변수 유형을 명확히 정해서 효율적으로 프로그래밍하는 것이 좋다.

 


반응형

'Back-End > Java' 카테고리의 다른 글

[Java] 배열(Array)  (0) 2023.02.04
[Java] 싱글톤 패턴(singleton pattern)  (0) 2023.02.03
[Java] static 변수  (0) 2023.02.03
[Java] 객체 간 협력  (0) 2023.02.02
[Java] this 예약어  (0) 2023.02.02