Programming

; develop a program

Back-End/Java

[Java] static 변수

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

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

 


static 변수란

static 변수는 클래스에서 공통으로 사용하는 변수를 선언할 때 사용되며, 다른 용어로 '정적 변수'라고도 한다.

클래스 내부에서 선언하지만, 다른 멤버 변수처럼 인스턴스가 생성될 때마다 새로 생성되는 변수는 아니다..

 

변수를 선언할 때 다음과 같이 자료형 앞에 static 예약어를 사용한다.

 

 

static 변수는 프로그램이 실행되어 메모리에 올라갔을 때 딱 한 번 메모리 공간이 할당되고, 그 값은 모든 인스턴스가 공유한다.

 

  • 일반 멤버 변수는 인스턴스가 생성될 때마다 새로 생성된다.
    (각각 다른 값을 가진다.)
  • static으로 선언한 변수는 인스턴스 생성과 상관없이 먼저 생성되고 그 값을 모든 인스턴스가 공유하게 된다.
  • 이러한 이유 때문에 클래스를 기반한 변수라고 해서 클래스 변수(class variable)라고도 한다.
    (인스턴스가 아닌 클래스 이름으로도 참조하여 사용할 수 있다.)
자바에서 static 변수를 클래스 변수라고 하는 이유
인스턴스마다 생성되는 변수가 아니라 클래스에 속해 한번만 생성되는 변수이고, 이를 여러 인스턴스가 공유하기 때문이다.

 

예제

static 변수 사용하기

public class Student {
	//static 변수는 인스턴스 생성과 상관없이 먼저 생성됨
	public static int serialNum = 1000;	
	public int studentID;
	public String studentName;
	public int grade;
	public String address;
	
	public String getStudentName(){
		return studentName;
	}
	
	public void setStudentName(String name){
		studentName = name;
	}
}
  • Student 클래스에서 기준 값 역할을 하는 seriaNum 변수를 선언하고 기준 값으로 1000을 대입한다.
  • 변수의 값은 학생이 생성될 때마다 순서대로 증가할 것이다.

 

static 변수 테스트하기

public class StudentTest1 {
	public static void main(String[] args) {
		Student studentLee = new Student();
		studentLee.setStudentName("아강인");
		System.out.println(studentLee.serialNum);	// 초깃값 출력
		studentLee.serialNum++;				// static 변수 증가
		
		Student studentSon = new Student();
		studentSon.setStudentName("손흥민");
		System.out.println(studentSon.serialNum);	// 증가된 값 출력
		System.out.println(studentLee.serialNum);	// 증가된 값 출력
	}
}

 

출력 결과

1000
1001
1002
  • studentLee를 먼저 생성하고 이 참조 변수를 사용하여 전체 인스턴스에서 공통으로 사용하는 serialNum 변수 값을 1 증가시킨다.
  • studentSon을 생성하고 아무 연산도 수행하지 않는다.
  • 각각에 serialNum 변수 값을 출력하면 둘 다 1001로 증가된 변수 값이 출력된다.

 

static으로 선언한 serialNum 변수는 모든 인스턴스가 공유한다.

즉, 두 개의 참조 변수가 동일한 변수의 메모리를 가지고 있다는 것을 알 수 있다.

 

 

클래스 메서드와 인스턴스 변수

클래스 메서드 내부에서는 인스턴스 변수를 사용할 수 없다.

public class Student {
	private static int serialNum = 1000;	//private 변수로 변경
	int studentID;
	String studentName;
	int grade;
	String address;
    ...
    
    public static int getSerialNum(){	//serialNumdml get() 메서드(클래스 메서드)
    	int i = 10;
        studentName = "홍길동";		//오류 발생
        return serialNum;
    }
}
  • getSerialNum( ) 메서드는 static 예약어를 붙인 클래스 메서드이고, 세 종류의 변수를 사용하고 있다.
  • int i 변수는 메서드 내부에서 선언했다. >> 지역 변수(local variable)
  • return serialNum; 문장에서 serialNum 변수는 static 변수이다. >> 클래스 메서드 내부에서 사용 가능
  • studentName 변수는 Student 클래스의 멤버 변수로, 인스턴스 변수이다. >> 오류 발생

 

정리

  • 클래스 메서드 내부에서 지역 변수와 클래스 변수는 사용할 수 있지만, 인스턴스 변수는 사용할 수 없다.
  • 클래스 메서드에서 인스턴스 변수를 사용할 수는 없지만 일반 메서드에서 클래스 변수를 사용하는 것은 전혀 문제가 되지 않는다.
    (일반 메서드는 인스턴스가 생성될 때 호출되는 메서드이고, 클래스 변수는 이미 만들어진 변수이기 때문에 일반 메서드에서도 클래스 변수를 호출할 수 있기 때문이다.)

 


반응형

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

[Java] 싱글톤 패턴(singleton pattern)  (0) 2023.02.03
[Java] 변수 유효 범위  (0) 2023.02.03
[Java] 객체 간 협력  (0) 2023.02.02
[Java] this 예약어  (0) 2023.02.02
[Java] 정보 은닉(Information Hiding)  (3) 2023.02.01