선언 위치에 따라서 변수는 3가지 종류로 나누어진다
class Variables{
int iv; //인스턴스 변수
static int cv; //클래스 변수(static변수, 공유변수)
//cv = (static + iv(인스턴스변수 앞에 static을 붙인 거)
void method(){
int lv = 0; //지역변수
}
}
✔ 클래스 안에는 변수나 메서드 선언문만 넣을 수 있다 (y=x+3;나 system.out.println()은 들어갈 수 없다)
출처 - 자바의 정석
❗ 위의 사진에서 중요한 건 인스턴스 변수는 인스턴스가 생성되었을 때
즉, 객체 생성하면 인스턴스 변수가 생성된다 (객체는 iv 변수 묶인거라고 생각하면 쉽다 그리고 iv는 참조변수 사라지면 Garbage Collection에 의해서 제거된다)
❗❗ cpu는 RAM(메모리)하고만 일을 하는데, 그래서 하드디스크가 로딩해서 메모리에 올릴때 클래스 변수는 생성 된다!
(즉, 객체 생성하지 않아도 된다. 인스턴스 변수와는 다르게 만들지 않고도 아무때나 사용 가능하다)
객체의 속성중에 개별적인 값을 가져야 하는 것은 인스턴스 변수(iv)로 하고,
모든 인스턴스가 공통으로 가져야하는 속성은 클래스 변수(cv)로 한다.
class card{
String kind; //무늬
int number; //숫자
static int width = 100; //폭
static int height = 250 ; //높이
}
Card c =new Card(); //객체 생성
c.kind = "HEART";
c.number = 5;
Card.width = 200;
Card.height = 300;
// 클래스 변수는 클래스이름.속성 이름으로 쓴다
//(위에 처럼 c 참조변수를 쓰는 것도 가능하지만 권장하지 않는다) - 인스턴스 변수로 오해할 수 있음
출처 - 자바의 정석
✔ 실제 함수가 실행되는 것을 보면 cv와 iv는 따로 실행되며,
cv는 하나로 묶여서 메모리를 절약하고, 객체를 생성할 때마다 cv와 iv가 함께 생성되는게 아니라 iv만 새로 생성된다
(그래서 만약 모든 객체의 공통 속성인 cv 변수를 변경하게 된다면 모든 객체의 cv값이 변경된다)