인스턴스 변수
인스턴스 변수는 인스턴스가 생성될 때 생성됩니다. 그렇기 때문에 인스턴스 변수의 값을 읽어오거나 저장하려면 인스턴스를 먼저 생성해야합니다. 인스턴스 별로 다른 값을 가질 수 있으므로, 각각의 인스턴스마다 고유의 값을 가져야할 때는 인스턴스 변수로 선언합니다. ( 아래 코드의 참조변수 c1, c2처럼 )
클래스 변수
클래스 변수는 인스턴스 변수에 static만 붙여주면 됩니다. 인스턴스 변수는 각각 고유한 값을 가지지만 클래스 변수는 모든 인스턴스가 공통된 값을 공유하게 됩니다. 한 클래스의 모든 인스턴스들이 공통적인 값을 가져야할 때 클래스 변수로 선언합니다. 클래스가 로딩될 때 생성되어(그러므로 메모리에 딱 한번만 올라갑니다.) 종료 될 때 까지 유지되는 클래스 변수는 public 을 붙이면 같은 프로그램 내에서 어디서든 접근할 수 있는 전역 변수가 됩니다. 또한 인스턴스 변수의 접근법과 다르게 인스턴스를 생성하지 않고 클래스이름.클래스변수명 을 통해서 접근할 수 있습니다.
지역 변수
메서드 내에서 선언되며 메서드 내에서만 사용할 수 있는 변수입니다. 메서드가 실행될 때 메모리를 할당 받으며 메서드가 끝나면 소멸되어 사용할 수 없게 됩니다.
public class CardTest {
// 1. CardTest 클래스의 main 메서드가 호출 되면서 프로그램 시작.
public static void main(String[] args) {
/** Card c1 = new Card();
* 2. Card 클래스의 instance 를 생성하기 위해 먼저 Card 클래스가 메모리에 로드된다.
* 이때 , Card 클래스의 클래스변수(cv)인 width 와 height 가 메모리에 생성되고 각각 100,250으로 초기화 된다.
* (static 이기 때문)
*
* 3. Card 인스턴스가 생성되고, 인스턴스변수(iv)인 kind 가 기본값인 null 과 0으로 각각 초기화 된다.
* 그리고 생성된 인스턴스의 주소가 참조변수 c1에 저장된다.
*/
Card c1 = new Card();
// 4. c1.kind 를 "Heart"로, c1.number 를 7로 변경
c1.kind = "Heart";
c1.number = 7;
// 5. Card 클래스가 이미 메모리에 로드 되었으므로 바로 Card 인스턴스가 생성되고 자동 초기화 된다. 그리고 그 주소가 참조변수 c2에 저장된다.
Card c2 = new Card();
// 6. c2.kind 를 "Spade"로, c2.number 를 4로 변경한다.
c2.kind = "Spade";
c2.number = 4;
/**
* 7. 인스턴스 c1,c2의 값을 화면에 출력
* 모든 인스턴스는 자신을 생성한 클래스의 주소를 갖고 있으므로,
* 참조변수를 사용해서도 클래스 변수에 접근할 수 있다.
*/
System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
// 8. 클래스변수 c1.width 와 c1.height의 값을 각각 50,80으로 변경
c1.width = 50;
c1.height = 80;
// 9. 인스턴스 c1과 c2의 값을 화면에 출력한다. 인스턴스 c1 과 c2는 클래스변수 width 와 height 를 공유하므로 같은 값이 출력된다
System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
System.out.println("c2은 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
// 10. main 메서드의 마지막까지 모두 수행되었으므로, main 메서드는 호출스택에서 제거되고 프로그램은 종료된다
}
}
class Card{
// iv,cv는 클래스 내부에 있으므로 멤버변수이다
// 인스턴스변수(iv)
String kind;
int number;
// 클래스변수(cv)
static int width = 100;
static int height = 250;
}
'General > Java☕️' 카테고리의 다른 글
id 필드에 Long 타입을 사용하는 이유 (1) | 2025.04.16 |
---|---|
JDK와 JRE의 차이점 (1) | 2025.04.15 |