- 선언위치에 따른 변수의 종류
변수의 종류를 결정짓는 요소는 '변수의 선언된 위치'이다. 멤버변수를 제외한 나머지 변수들은 모두 지역변수이며, 멤버변수 중 static이 붙은 것은 클래스변수, 붙지 않은 것은 인스턴스변수다.
/* 클래스 영역 */
class Variables {
int iv; // 인스턴스변수
static it cv; // 클래스변수(static변수, 공유변수)
/* 메서드 영역 */
void method() {
int lv = 0; // 지역변수
}
}
변수의 종류 | 선언위치 | 생성시기 |
클래스변수 (class variable) |
클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스변수 (instance variable) |
인스턴스가 생성되었을 때 | |
지역변수 (local variable) |
클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
1. 인스턴스변수(instance variable)
클래스 영역에 선언, 사용하기 위해서는 인스턴스를 먼저 생성해야 한다. 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
2. 클래스변수(class variable)
인스턴스변수 앞에 static을 붙이면 된다. 클래스변수는 인스턴스를 생성하지 않고도 언제든지 사용할 수 있다. 클래스변수는 클래스가 메모리에 '로딩(loading)' 될 때 생성되어 프로그램이 종료될 때까지 유지된다.
3. 지역변수(local variable)
메서드 내에 선언되어 메서드 내에서만 사용이 가능하며, 메서드가 종료되면 소멸되어 사용할 수 없다. for문 또는 while문의 블럭 내에 선언된 지역변수는 블럭{} 내에서만 사용이 가능하다.
- CardTest.java
public class CardTest {
public static void main(String[] args) {
System.out.println("Card.width = " + Card.width);
System.out.println("Card.height = " + Card.height);
Card c1 = new Card();
c1.kind = "Heart";
c1.number = 7;
Card c2 = new Card();
c2.kind = "Spade";
c2.number = 4;
System.out.printf("c1은 %s, %d이고 크기는 (%d, %d)%n", c1.kind, c1.number, Card.width, c1.height);
System.out.printf("c2은 %s, %d이고 크기는 (%d, %d)%n", c2.kind, c2.number, c2.width, c2.height);
System.out.println("c1의 width와 height를 각각 50, 80으로 변경합니다.");
c1.width = 50;
Card.height = 80;
System.out.printf("c1은 %s, %d이고 크기는 (%d, %d)%n", c1.kind, c1.number, c1.width, c1.height);
System.out.printf("c2은 %s, %d이고 크기는 (%d, %d)%n", c2.kind, c2.number, c2.width, c2.height);
}
}
public class Card {
String kind;
int number;
static int width = 100;
static int height = 250;
}
인스턴스변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.
참고문헌 : 남궁성(2016), Java의 정석, 도우출판