static 변수

  • 다른 말로 '정적 변수'라고도 한다. 클래스에 기반한 변수라고 해서 클래스 변수(class variable)라고도 한다. 클래스 변수라 하는 이유는 인스턴스마다 생성되는 변수가 아니라 클래스에 속해 한 번만 생성되는 변수이고 이를 여러 인스턴스가 공유하기 때문이다.
  • 자바에서는 다른 멤버 변수처럼 클래스 내부에 선언한다.
  • 변수를 선언할 때 다음과 같이 자료형 앞에 static 예약어를 사용한다.
static int	serialNum;
  • static 변수는 클래스 내부에 선언하지만, 다른 멤버 변수처럼 인스턴스가 생성될 때마다 새로 생성되지 않는다.
  • static 변수는 프로그램이 실행되어 메모리에 올라갔을 때 딱 한 번 메모리 공간이 할당된다. 그리고 그 값은 해당 클래스의 모든 인스턴스가 공유한다.
  • static변수는 인스턴스 생성과는 별개이므로 인스턴스보다 먼저 생성된다. 프로그램이 실행될 때 생성된다.
  • 인스턴스 간에 공통으로 사용할 값이 필요한 경우 유용하게 사용할 수 있다.
  • 자바에서 static 변수, 정적 변수, 클래스 변수라는 세 가지 용어는 모두 동일하다.
  • static 변수의 값은 데이터 영역에 저장된다.
  • 인스턴스뿐만 아니라 클래스 이름으로 참조가능하다. 클래스 이름으로 참조하는 것이 더 일반적이다.

클래스 메서드

static 변수를 웨한 메서드이다. static 메서드 또는 클래스 메서드라고 한다. static 메서드 또한 static 변수처럼 인스턴스뿐만아니라 클래스 이름으로 직접 호출할 수 있다.

public class Student{
	private static int serialNum = 1000;
    String studentName;
    
    public static int getSerialNum(){
    	int i = 10;
        //studentName = "이지원"; 에러 발생
        return serialNum;
    }
}

int i는 지역변수로 함수가 호출될 때마다 선언되어 사용가능
serialNum은 static 변수이다. static 변수는 클래스를 선언할 때 특정 메모리(데이터 영역)에 저장되기 때문에 사용가능하다. studentName은 사용 불가. studentName은 Student 클래스의 멤버 변수로 인스턴스가 생성될 때 만들어지는 인스턴스 변수이기 때문이다. 따라서 studentName처럼 인스턴스가 생성되어야 메모리가 할당되는 인스턴스 변수는 클래스 메서드에서 사용할 수 없다.
클래스 메서드 내부에서 지역변수와 클래스 변수는 사용할 수 있지만, 인스턴스 변수는 사용할 수 없다.
반대로 일반 메서드에서 클래스 변수를 사용하는 것은 가능하다.
일반 메서드는 인스턴스가 생성될 때 호출되는 메서드이고, 클래스 변수는 이미 만들어진 변수이기 때문에 일반메서드에서도 클래스 변수를 호출할 수 있다.

변수 유효 범위(variable scope)

  1. 지역 변수
    함수나 메서드 안에서만 사용할 수 있는 지역변수(로컬 변수, local variable)
    함수에서 기능 구현을 위해 잠시 사용하는 경우
  • 지역 변수는 함수나 메서드 내부에 선언하기 때문에 함수 밖에서는 사용할 수 없다.
  • 지역변수가 생성되는 메모리를 스택(stack) 메모리라고 한다.
    스택 메모리에 생성되는 지역 변수는 함수가 호출될 때 생성되었다가 함수가 반환되면 할당되었던 메모리 공간이 해제되면서 함께 없어진다.
  • 함수 내부에서만 사용
  1. 멤버 변수
    클래스 안에서 사용하는 멤버 변수(인스턴스 변수, instance variable)
    클래스의 속성을 나타내고 각 인스턴스마다 다른 값을 가지는 경우
  • 멤버 변수는 인스턴스 변수라고도 한다.
  • 클래스 멤버 변수로 선언한다.
  • 클래스 내부에서 사용하고 private이 아니라면 참조 변수로 다른 클래스에서 사용 가능하다.
  • 인스턴스가 생성될 때 힙(heap) 메모리에 생성되는 변수이다.
    힙 메모리에 생성된 인스턴스가 가비지 컬렉터(garbage collector)에 의해 수거되면 메모리에서 사라진다.
  1. static 변수
    여러 인스턴스에서 공통으로 사용할 수 있는 static 변수(클래스 변수, class variable)
    여러 인스턴스에서 공유해서 사용하도록 한 번만 생성되는 경우
  • static 예약어를 사용하여 클래스 내부에 선언한다. 클래스 내부에서 사용하고 private이 아니라면 클래스 이름으로 다른 클래스에서 사용 가능하다.
  • 사용자가 프로그램을 실행하면 메모리에 프로그램이 상주한다. 이때 프로그램 영역에 데이터 영역이 있다. 데이터 영역에는 상수나 문자열, static 변수가 생성된다.
  • 인스턴스 변수는 객체가 생성되는 문장 즉 new가 있어야 생성되지만, static 변수는 클래스 생성과 상관없이 처음부터 데이터 영역 메모리에 생성된다.
  • 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸된다.
  • 따라서 인스턴스 변수와 static 변수는 사용하는 메모리가 다르다. 이렇게 생성된 static 변수는 private이 아니라면 클래스 외부에서도 객체 생성과 무관하게 클래스 이름으로 참조하여 사용할 수 있다.
  • 프로그램 실행이 끝난 뒤 메모리에서 내려가면(프로그램 종료) static 변수도 소멸된다.
  • static 변수는 프로그램이 시작할 때부터 끝날 때까지 메모리에 상주하므로 크기가 너무 큰 변수를 static으로 선언하는 것은 좋지 않다.
  • 데이터 영역은 상수 영역 혹은 static 영역이라고 표현하는 경우도 있다.

출처

  • do it 자바프로그래밍 입문
profile
정팔입니다.

0개의 댓글