Java - 멤버변수, 지역변수, 클래스변수, 인스턴스변수
변수를 선언위치에 따라 크게 구분하면 딱 2가지로 나눌 수 있다.
바로 멤버변수 / 지역변수 입니다.
멤버변수는 선언위치가 '클래스 영역' 이고,
지역변수의 선언위치는 '메소드나 생성자 내부' 이다
멤버변수는 다시 두 가지로 나누어진다
바로 클래스변수 / 인스턴스변수 이다
이 둘은 같은 멤버변수에 속하지만 필요한 상황이 굉장히 다르다
이해를 돕기 위해 예를 하나 들어보겠다. 우리가 게임을 처음 시작할 때, 캐릭터를 하나 만든다.
캐릭터를 만들 때 머리색깔을 블랙,골드,브라운 중에서 고를 수 있다고 하면, 머리색깔이라는 변수는 모든 캐릭터마다 다른 값을 가질 수 있다.
즉, 각각의 객체(=인스턴스)마다 개별적인 속성을 가져야 할 때, 우리는 인스턴스 변수를 선언해서 사용한다.
반대로 클래스 변수는, 모든 객체가 공통적으로 똑같은 속성을 가질 때 사용하는 것입니다. 다시 게임 캐릭터의 예를 들면, 캐릭터별로 키를 다르게 가질 수는 없고 모든 캐릭터가 2m의 키를 갖도록 고정한다고 하면, 이 키는 클래스 내 모든 객체(=인스턴스)가 똑같이 가지는 속성이므로 클래스변수가 됩니다.
일반적으로 앞에 'static' 이라는 단어가 붙어있으면 클래스변수라 할 수 있고, 이 클래스 변수는 클래스 내 모든 영역에 영향을 끼치는 전역함수의 성질을 가진다. 뒤에 배울 지역함수의 반대 개념이다.
각 캐릭터(=객체)를 생성할 때 마다
바꿀 수 없는 키 = 클래스변수
바꿀 수 있는 머리색깔 = 인스턴스변수
아래는 예시이다
class GameCharacter
static int height = 180 // 클래스변수, 1.8미터의 키 모든 객체(=인스턴스)에 적용
String haircolor; // 인스턴스변수, 값이 고정되지 않아서 각 객체마다 다른 값 가능
// (각 객체마다 다른 값을 설정하기 위해서는 나중에 메소드 안에서 실제로 객체를 생성하면서 시행한다. )
이렇게 정리하면 된다.
다시 앞으로 돌아가서, 선언위치에 따라 변수는 크게 멤버변수/지역변수로 나누어 지고, 멤버변수는 클래스변수와 인스턴스 변수로 나누어 진다는 것을 정리했다. 이제 남은 것은 지역변수이다.
지역변수는 메소드 내에 선언되어 메소드 내에서만 사용이 가능한 변수를 말하며 메소드가 종료되면 자동으로 소멸된다. 메소드라는 건 '프로그램이 어떤 동작을 하게 하는 명령기능' 이라고 이해할 수 있는데, 영어공부와 관련지어 이야기 하면 '동사' 에 해당힌다. 메소드는 System.out.println(); 과 같은 아이들처럼 JAVA 자체에서 제공하지만, 개발자가 직접 만들어서 사용하기도 한다. 메소드는 대략 이런 식으로 생겼다.
public static void main(String[] args) {
}
void print() {
}
{ } 중괄호 안에 들어있는 내용을 실행하라. 이런 것이죠.
때문에 메소드 내에서 선언되고 사용되어 지는 지역변수는, 당연히 저 중괄호 내부에 들어있어야 합니다.그리고 중괄호 안에서는 변수로서 역할을 하지만 밖에서는 없는 존재나 다름 없는 것이죠.
[출처 : 책 GOOD JAVA , 우재남 지음, 한빛아카데미]