
선언 위치에 따른 변수의 종류
변수의 종류
- 멤버 변수
- 클래스 변수
- 인스턴스 변수
- 지역 변수

멤버 변수
- 선언 위치가 클래스 영역.
- 인스턴스 변수와 클래스 변수를 멤버 변수가 속해있음.
인스턴스 변수
- 클래스의 인스턴스를 생성할 때 만들어진다. 따라서, 인스턴스 변수의 값을 읽어 오거나 저장하기 위해서는 먼저 인스턴스를 생성해야한다.
- 인스턴스는 독립적인 저장 공간을 가지므로 서로 다른 값을 가질 수 있다.
- 인스턴스마다 고유의 값을 저장해야 할 경우, 인스턴스 변수로 선언한다.
클래스 변수
- 인스턴스 변수 앞에 static 키워드를 붙이면 된다.
- 클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유하게 된다.
- 모든 인스턴스들이 공통적인 값을 유지해야하는 경우, 클래스 변수로 선언한다.
지역 변수
- 메서드 영역에 선언된 변수.
- 메서드 내에서만 사용이 가능하다.
- 메서드가 종료되면 소멸되어 사용이 불가능 하다.
- 또한, for문 또는 while 문의 블럭 내에서 선언된 지역 변수들은 해당 블럭 내에서만 사용이 가능하며, 해당 블록을 벗어나면 소멸한다.
클래스 메서드(static메서드)와 인스턴스 메서드
클래스 메서드
- 변수에서 그랬던 것과 같이, 메서드 앞에 static이 붙어 있으면 클래스메서드이다. (그렇지 않으면, 인스턴스 메서드)
- 클래스 메서드도 클래스 변수처럼, 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같은 식으로 호출이 가능하다.
- 인스턴스 변수나 인스턴스 메서드를 사용할 수 없음.
클래스 메서드와 인스턴스 메서드는 언제 사용할까?
- 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다.
- 인스턴스 변수는 인스턴스가 생성되어야 만들어지므로 인스턴스 메서드 또한 인스턴스를 생성해야만 호출 할 수 있는 특징이 있다.
- 클래스 메서드는 인스턴스와 관계없는(인스턴스 변수나 메서드) 메서드를 클래스 메서드로 정의한다.
정리
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용하는 것에 static을 붙인다.
- 클래서 변수는 인스턴스를 생성하지 않아도 사용이 가능하다.
- 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
- 인스턴스 변수는 인스턴스가 반드시 있어야 존재할 수 있지만, 클래스 메서드는 인스턴스 생성 없이 호출이 가능하다.
- 클래스 메서드 호출 시점 인스턴스가 생성되지 않을 수 도 있기 때문에 금지한다.
- 반대로, 인스턴스 메서드에서는 클래스 변수 클래스 메서드 사용이 가능하다. (인스턴스 메서드를 사용하는 시점에서 항상 인스턴스가 생성되어 있기 때문에, static이 붙은 변수나 메서드는 이미 메모리에 존재한다는 것을 의미)
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
- 메서드 호출시간이 짧아지므로 성능이 향상된다. (static이 붙은 메서드는 이미 고유한 메모리 주소를 갖고 있기 때문에)
- static이 안 붙은 메서드는 실행 시 호출되어야할 메서드를 찾는 과정이 필요.