인스턴스변수
- Non-static 멤버
- 클래스 내에 선언된 변수
- 각각의 객체(인스턴스)마다 별도로 생성되며, 객체의 속성을 나타냄
- 생성될 때마다 각각의 인스턴스 변수가 할당되고, 해당 객체가 삭제될 때 메모리에서 제거
- 객체마다 독립적으로 존재, 한 객체의 인스턴스 변수 변경은 다른 객체에 영향을 주지 않음
- 클래스 변수와 달리 공유되지 않음
클래스변수
- Static 멤버, 정적 변수
- 해당 클래스 내부에서 정의되며, 그 클래스에 속하는 모든 인스턴스가 공유
- 프로그램이 시작될 때 할당되고, 프로그램이 종료될 때까지 메모리에 유지
- 클래스가 여러 번 생성되어도 Static 변수는 처음 딱 한 번만 생성됨
- 모든 인스턴스에 영향을 줄 수 있으며, 한 곳에서 변경되면 다른 곳에서도 변경된 값을 참조
예제

결과

클래스 변수 classVar은 처음 한 번만 생성되고 동일한 객체를 varTest1 과 varTest2 에서 서로 공유하기 때문에 양쪽이 동시에 바뀌었지만 instanceVar은 객체 생성 시 마다 매번 새로 메모리에 할당되기 때문에 varTest1.instanceVar만 변경
차이점
- 클래스 변수는 클래스 전체에서 공유
- 인스턴스 변수는 개별 객체에 속하는 변수
지역 변수(번외)
- 메서드 내에서 선언되고 메서드 내에서만 사용할 수 있는 변수
- 메서드가 실행될 때 메모리를 할당 받으며 메서드가 끝나면 소멸되어 사용 불가능
void method(){
int localVar; //지역변수
}
변수와 생명주기
- 인스턴스변수 : 힙 영역을 사용, GC(가비지 컬렉션)가 발생하기 전까지는 생존하기 때문에 보통 지역 변수보다 생존 주기가 김
- 클래스변수 : 메서드 영역의 static 영역에 보관되는 변수, 메서드 영역은 프로그램 전체에서 사용하는 공용 공간, 가장 긴 생명주기를 가짐
- 지역변수 : 스택 영역에 있는 스택 프레임 안에 보관, 생존 주기가 짧음
결론
- 자바는 캡슐화 원칙에 따라 어떤 변수나 함수도 클래스 바깥에 존재할 수 없기에 전역변수나 전역메소드로 사용해야 할 경우 클래스 변수가 필요
- 객체 지향 프로그래밍에서 데이터를 구성하고 사용하는 방식에 영향을 미치고 각 변수의 활용은 프로그램의 구조와 목적에 따라 달라짐
