개발자 데뷔!

10. [Java] static 변수 본문

프로그래밍 언어/Java

10. [Java] static 변수

물꼮이 2022. 2. 1. 01:37

 

static 변수
= 정적변수
 = 클래스변수

 


static 

 - '클래스변수(class variable)' 라고도 함

 - 클래스 전반에서 공통으로 사용할 수 있는 기준변수 

 - 각 인스턴스마다 따로 생성되는 변수가 아님 

 - ex) 학생 인스턴스마다 학번을 자동생성

 

static 쓰임

 - 클래스 내부에 선언. 

 - 변수 선언 시, 자료형 앞에 static 예약어를 사용한다. 

static예약어 자료형 변수이름
static int studentNum;

 

static 의 메모리할당  

- Data 영역에 할당된다!!   (ex) 인스턴스 = heap 영역 / 참조변수 = stack 영역) 

- 즉, 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. (Data 영역의 특징)

- 프로그램이 실행되어 메모리에 올라갔을 때 한 번만, 메모리 공간이 할당됨. 

- 이후, 생성되는 인스턴스들은 초기에 할당된 그 값을 공유한다. 

- 인스턴스가 생성될 때마다 새로 생성되는 멤버변수와 다르다.

- 단, 인스턴스보다 먼저 생성되기 때문에, 인스턴스가 생성되지않아도 class이름을 직접 참조해 사용할 수 있다.

 


static 사용 예시 _ 학번 자동생성 시스템

학번을 static 변수로 두면,

인스턴스(학생)가 생성될 때마다 static 변수는 1씩 증가하고, 

이를 매번 학번 studentID 에 대입해 사용한다. 

그렇지 않으면, 모든 인스턴스가 static 변수를 공유하므로, 모두 같은 학번을 가지게 되기 때문이다.

 

package staticex;

public class Student1 {
	public static int serialNum = 1000;	// static 변수 선언
	int studentID;
	String studentName;
	int grade;
	String address;
	// 생성자 
	public Student1(){
		serialNum++;			// 인스턴스(학생)이 새로 생성될 때마다, serialNum은 1씩 증가
		studentID = serialNum;		// static 변수를 그대로 사용할 시, 모두 같은값(학번)을 사용하게 되므로 
        					// 매번 생성된 학번값(serialNum)을 다른 member변수에 대입해줌
	}
	// getter, setter 메서드
	public String getStudentName(){
		return studentName;
	}
	public void setStudentName(String name){
		studentName = name;
	}

}

 

 


클래스 메서드

: static 변수를 위한 메서드

 = static 메서드

 = class 메서드

 

static 변수는 data 영역에, 인스턴스보다 먼저 생성되기 때문에 다음과 같은 특징을 갖는다.

  • 인스턴스 이름이 아닌, 클래스이름으로 바로 참조가능. (권장)
  • 클래스 메서드 (static method) 또한 static으로 선언
  • priavate - static 인 멤버변수를 사용할 경우, 반드시 static 인 get(), set() 메서드를 통하여 접근해야 함
  • 클래스 메서드 내부에서는, 인스턴스 변수를 사용할 수 없다. (만들어지기 전이기 때문)


변수의 종류 & 유효범위(scope)

변수유형 선언위치 사용범위 메모리 생성과 소멸
지역변수
(local변수)
함수 내부에 선언 함수 내부에서만 스택 함수 호출시 생성,
함수 끝날시 소멸
멤버변수
(instance 변수)
클래스 멤버변수로 선언 클래스 내부 & private이 아닐 경우 다른 클래스 포함
(with 참조변수)
인스턴스 생성 시 생성,
'가비지 컬렉터'가 메모리 수거시 소멸
static변수
(class 변수)
클래스 내부에
(static 예약어)로 선언
클래스 내부 & private이 아닐 경우 다른 클래스
(with 클래스 이름)
데이터 프로그램 첫 시작시 생성,
프로그램 끝나고 메모리 해제 시 소멸
  • 지역변수는 선언한 메서드 내부 에서만 사용할 수 있지만,
  • 멤버변수는 클래스의 어느 메서드에서나 사용할 수 있다. 즉, 여러메서드에서 사용하는 변수는 멤버변수로 설정
  • static 변수는 여러 인스턴스에서 공통으로 사용한다. 클래스 생성과 상관없이 데이터 영역에 메모리 생성.