General/Java☕️

멤버변수 ( 인스턴스변수, 클래스변수)와 지역변수

개발자겨려 2022. 4. 5. 17:02

변수의 종류

인스턴스 변수

 인스턴스 변수는 인스턴스가 생성될 때 생성됩니다. 그렇기 때문에 인스턴스 변수의 값을 읽어오거나 저장하려면 인스턴스를 먼저 생성해야합니다. 인스턴스 별로 다른 값을 가질 수 있으므로, 각각의 인스턴스마다 고유의 값을 가져야할 때는 인스턴스 변수로 선언합니다. ( 아래 코드의 참조변수 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