선언된 위치에 따라 구분되는 변수는 생성 및 소멸 시기, 저장되는 메모리 공간과 사용 방법까지 서로 다르다.
변수 | 생성 시기 | 소멸 시기 | 저장 메모리 | 사용 방법 |
---|---|---|---|---|
클래스 변수 | 클래스가 메모리에 올라갈 때(클래스가 사용이 될 때) | 프로그램이 종료될 때 | 메소드 영역 | 클래스 이름, 변수 이름 |
인스턴스 변수 | 인스턴스가 생성될 때 | 인스턴스가 소멸할 때 | 힙 영역 | 인스턴스 이름, 변수 이름 |
지역 변수 | 블록 내에서 변수의 선언문이 실행될 때 | 블록을 벗어날 때 | 스택 영역 | 변수 이름 |
public class Variables{
int instanceVar; // 인스턴스 멤버 변수
static int classVar; // 클래스 멤버 변수
public void method(int parameterVar){ //파라미터 변수
int localVar = 0; //로컬 변수
}
}
모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다, 클래스가 메모리에 로드될 때 생성된다.
처음 프로그램이 로드될 때 데이터 영역(static 영역, 클래스 영역)에 생성이 된다.
인스턴스의 생성과 상관 없이 사용할 수 있으므로 클래스 이름으로 참조한다.(ex- 클래스명.static변수명,Student.name = "홍길동")
static int classVar;
System.out.println("클래스 변수");
System.out.println(Variable.classVar); // 0으로 초기화가 된다.
객체를 생성해서 사용하는 변수로 클래스명으로 접근이 불가능하다.
초기화를 해주지 않았을 경우, 자동으로 자료형의 기본값으로 초기화가 된다.
int instanceVar; // 인스턴스 멤버 변수, 필드, 속성
System.out.println("인스턴스 멤버 변수");
Variable var = new Variable();
// 인스턴스를 만들어야 실체가 있기 때문에
System.out.println(var.instanceVar);
//0으로 초기화가 됨.외워야됨.
각 자료형의 초기화값
변수의 타입 | 초기값 |
---|---|
char | '\u0000' |
byte,short,int | 0 |
long | 0L |
float | 0.0f |
double | 0.0 |
boolean | false |
배열,인스턴스 등 | null |
public void method(int paramVar){ //로컬 파라미터 변수
System.out.println(paramVar);
int localVar; //로컬 변수
System.out.println(localVar); //error 로컬변수는 초기화가 자동으로 안됨.
localVar = 10;
System.out.println(localVar); //이렇게 값을 대입해서 사용해야 한다.
{
localVar = 30;
}
int localVar2 = 20;
}
System.out.println(localVar); //블록 내에서 수정한 것도 반영됨.
localVar2 = 40; // 접근 불가. 생명주기가 끝났다. Life-Cycle이 끝났다.