반응형
이번 포스팅에서는 자바(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 |