변수의 종류 | 선언위치 | 생성시기 |
---|---|---|
클래스 변수 | 클래스영역 | 클래스가 메모리에 올라갈 때 (같은 클래스끼리 공유) |
인스턴스 변수 | 클래스영역 | 인스턴스가 생성되었을 때 |
지역 변수 | 클래스 영역 이외의 영역 (매서드, 생성자, 초기화 블럭 내부) | 변수 선언문이 수행되었을 때 |
class Variables
{
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(static변수, 공유변수)
void method()
{
int lv = 0; // 지역변수
}
}
class Card
{
String kind;
int number;
static int width = 100;
static int height = 250;
}
Card c = new Card();
c.kind = "HEART";
c.number = 7;
c.width = 200; // 보통 이렇게 잘 쓰이지 않음
c.height = 300; // 보통 이렇게 잘 쓰이지 않음
Card.width = 200;
Card.height = 300;
class InitTest{
int x;
int y = x;
void method1(){
int i; // 지역변수
int j = i; // error : 지역 변수를 초기화하지 않고 사용
}
}
=
대입 연산자를 통해 선언class Car{
int door = 4; // 기본형(primitive type) 변수의 초기화
Engine e = new Engine(); // 참조형(reference type) 변수의 초기화
// 참조형 변수를 초기화하기 위해서 객체를 생성해서 넣어주어야 한다.
}
{ }
static { }
class StaticBlockTest{
static int[] arr = new int[10]; // 명시적 초기화
static { // 클래스 초기화 블럭 - 배열 arr을 난수로 채운다.
for(int i=0; i<arr.length; i++){
arr[i] = (int)(Math.random()*10)+1;
}
}
}
Car(String color, String gearType, int door){ // 매개변수 있는 생성자
this.color = color;
this.gearType = gearType;
this.door = door;
}
class InitTest{
static int cv = 1; // 명시적 초기화
int iv = 1; // 명시적 초기화
static { cv = 2; } // 클래스 초기화 블럭
{ iv = 2; } // 인스턴스 초기화 블럭
InitTest(){ // 생성자
iv = 3;
}
}