클래스 변수 (Class Value) - 각 객체별로 공통적인 속성 (객체 생성없이 사용가능)
인스턴스 변수 (Instance Value) - 각 객체로 공통적이지 않은 속성
한가지 예시로 설명하자면 포커카드의 상대방이 내 카드크기만 보고 카드값을 를 알수 없어야 하기에 동일사이즈 (CV)로 제작되고 카드값(IV)은 각자 다르게 제작된다(스페이드3,다이아9 등)
////////
//코드1
////////
class CardTest{
public static void main(String args[]){
Card c1 = new Card();
c1.kind = "Heart";
c1.number = 7;
Card c2 = new Card();
c2.kind = "Dia";
c2.number = 5;
System.out.println("c1은"+c1.kind+c1.number+"이며, 처음 크기는"+c1.width+","+c1.height+"");
System.out.println("c2은"+c2.kind+c2.number+"이며, 처음 크기는"+c2.width+","+c2.height+"");
c1.width = 300;
c1.height = 350;
System.out.println("c1은"+c1.kind+c1.number+"이며, 바꾼 크기는"+c1.width+","+c1.height+"");
System.out.println("c2은"+c2.kind+c2.number+"이며, 바꾼 크기는"+c2.width+","+c2.height+"");
}
}
////////
//코드2
////////
class Card {
String kind; //무늬,IV
int number; //숫자,IV
static int width = 100; //폭,CV
static int height = 250; //높이,CV
}
코드2에서 card를 선언후 코드1에서 호출하는 형태의 코드를 작성하였는데 해당 코드를 실행시켯을 경우 하단과 같은 결과가 나타나게 된다.
이것은 CV와 IV의 생성시점이 다르기 때문에 나타나는 문제인데 객체 생성시마다 IV는 계속 생기는데(신규 메모리를 할당받는데) CV는 초기 메모리에 선언된이후 처음 메모리에 계속 참조되는 형식으로 진행되기 때문에 같은 값이 출력되는 것이다.
순서를 말하자면
1.처음 시작시 Card클래스의 인스턴스가 생성되기 위해 Card클래스(CV)가 메모리에 로드되는데 이때 width와 height가 메모리에 초기화된다.
2.Card인스턴스 생성후 맴버변수인 kind와 number은 초기화가 되고 코드1에서 값을넣은 주소(IV)가 참조변수 c1에 저장이된다.
3.Card클래스는 기존 메모리에 로드되어 있으므로 Card클래스를 신규 생성하는게 아닌 기존의 있는 Card 클래스를 재사용 하기 때문에 코드1에서 값을 넣은 주소(IV)가 참조변수는 c2에 저장된다.