728x90
변수의 종류
1. 인스턴스 변수 : 클래스 영역에 선언. 클래스의 인스턴스를 생성할 때 만들어진다.
-> 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스 변수로 선언
2. 클래스 변수 : 모든 인스턴스가 공통된 저장공간(변수)을 공유한다.
->한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성
3. 로컬 변수 : 메서드 내에 선언되어 메서드 내에서만 사용 가능, 메서드가 종료되면 소면되어 사용할 수 없다.
클래스 변수와 인스턴스 변수
- 클래스 변수
- 여러 개의 인스턴스가 static 변수를 공유한다.
- 클래스 변수는 여러 인스턴스가 하나의 메모리 값을 공유할 때 필요하다.
- 기준이 되는 값을 static 변수로 생성하여 유지한다.
데이터 영역 | 스택 메모리 | 힙 메모리 |
1001 | <- studentLee -> | studentLee인스턴스 |
<- studentSon -> | studentSon인스턴스 |
각 학생이 생성될 때 마다 static 변수 값을 복사해 와서 하나 증가시킨 값을 생성된 인스턴스의 학번 변수에 저장해 줌
public class Student {
private static int serialNum = 10000;
int stuentID;
String studentName;
public Student() {
serialNum++;
studentID = serialNum;
}
public static int getSerialNum() {
int i = 10; // 지역변수
i++;
System.out.println(i);
// studentName = "홍길동"; // 멤버변수, 인스턴스 변수
// 쓰지 못하는 이유 : 인스턴스 변수를 쓰게 되면 생성되지 않은 인스턴스 변수인 홍길동을 넣게 되는 것
// 그래서 static 메서드에서는 사용할 수 없다.
return serialNum; // static 변수, 클래스 변수
}
}
public class StudentTest1 {
public static void main(String[] args) {
//static 변수는 객체 생성을 굳이 하지 않고 클래스이름으로 바로 사용할 수 있다.
System.out.println(Student.serialNum);
/*
Student studentJ = new Student();
System.out.println(studentJ.studentID);
Student studentT = new Student();
System.out.println(studentT.studentID);
System.out.println(Student.serialNum);
*/
}
}
- 인스턴스 변수
인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있다.
변수의 유효 범위
변수 유형 | 선언위치 | 사용 범위 | 메모리 | 생성과 소멸 |
로컬변수 | 함수 내부에 선언 | 함수 내에서만 사용 | 스택 | 함수가 호출될 때 생성되고 함수가 끝다면 소멸함 |
인스턴스 변수 | 클래스 영역 | 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용가능 | 힙 | 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨 |
static변수 (클래스 변수) |
클래스내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능 | 데이터 영역 | 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨 |
출처 : 자바의 정석, do it 자바프로그래밍
'Java > 객체지향 프로그래밍' 카테고리의 다른 글
클래스 멤버와 인스턴스 멤버간의 참조와 호출 (0) | 2021.09.19 |
---|---|
메서드 (0) | 2021.09.17 |