자바 (ref. 자바의정석)

클래스변수, 인스턴스변수, 지역변수 - JAVA

쿠쿠s 2022. 2. 9. 14:43

 

 

 

변수는 선언위치에 따라 종류가 다릅니다. 클래스변수, 인스턴스변수, 지역변수 모두 세 종류가 있습니다. '선언된 따라 종류가 결정되므로 어느 영역에 선언되었는지 파악하는 게 중요합니다. 멤버변수를 제외한 나머지 변수들은 모두 지역변수이며, 멤버변수 중 static 이 붙은 것은 클래스변수, 붙지 않은 것은 인스턴스 변수입니다.

 

 

예시)

public class varExam {

    int instanceVariable; //인스턴스변수
    static int classVariable; //클래스변수 (static변수, 공유변수)

    void method(){
        int localVariable; //지역변수
    }

}

 

 

 

인스턴스 변수(instance vairable)

- 클래스 영역에 선언

- 클래스 인스턴스를 '생성할 때' 만들어짐

- 인스턴스는 독립적인 저장공간을 가져 서로 다른 값을 가질 수 없음

 

클래스 변수(class variable)

- 클래스 영역에 선언하는데 인스턴스 변수 앞에 static을 붙이면 됨

- 모든 인스턴스가 공통된 저장공간을 공유하게 됨

- 인스턴스변수와 달리 인스턴스를 생성하지 않고도 사용이 가능함

 

지역변수(local variable)

- 메서드 내에 선언되며 해당 메서드 내에서만 사용이 가능

- 메서드가 종료되면 소멸되어 사용 불가

- for, while문의 블럭{ } 내에 선언된 지역변수는 블럭을 벗어나면 사용이 불가

 

 

 

자동차를 활용하여 클래스변수와 인스턴스변수 차이를 코드로 직접 예시를 만들어 봤습니다.

public class ExampleJAVA {
    public static void main(String[] args) {

        System.out.println("K자동차 최대속도 = " + K_Car.maxSpeed); // 클래스 변수는 객체 생성 없이 사용가능!
        System.out.println("K자동차 제로백= " + K_Car.zero100); // 클래스이름.클래스변수 로 직접 사용한다.

        K_Car k3 = new K_Car();
        k3.model = "22년도k3";
        k3.price = 1700;

        K_Car k5 = new K_Car();
        k5.model = "22년도k5";  //인스턴스 변수의 값을 변경
        k5.price = 2300;

        System.out.println(k3.toString());
        System.out.println(k5.toString());

        k5.maxSpeed = 300; //클래스변수의 값을 변경
        k5.zero100 = 4;

        System.out.println(k3.toString());
        System.out.println(k5.toString());
    }

}

class K_Car{
    String model;
    int price;
    static int maxSpeed = 250;
    static int zero100 = 6;

    @Override
    public String toString() {
        return "K_Car{" +
                "모델='" + model + '\'' +
                ", 가격=" + price + '\'' +
                ", maxSpeed=" + maxSpeed + '\'' +
                ", 제로백=" + zero100 +
                '}';
    }
}

 

출력 결과

 

각 자동차별로 모델연식과 가격을 가진다고 설정하여 인스턴스 변수를 선언하고, 최대 속도와 제로백의 제한은 모든 자동차에 공통적으로 설정되는 가정을 하여 클래스 변수를 사용하였습니다.

 

 

K_Car의 클래스변수는 '클래스이름.클래스변수'와 같은 방식으로 사용이 가능합니다. 인스턴스인 k3와 k5는 클래스 변수를 공통적으로 사용하기 때문에 k3의 최대 속도와 제로백을 변경해도 k5도 적용이 됩니다.

근데 사실 사용할 때 k3.maxSpeed 같이 객체 인스턴스가 클래스 변수를 사용할 수는 있지만 권장하지는 않습니다.

ide에서도 자동완성을 시켜주지도 않을뿐더러 인스턴스 변수로 오해하기 쉽기 때문입니다.

 

결론은 클래스에서 공통된 속성을 가진다고 생각되면 클래스 변수로 사용하고 각각 독립된 값을 가지면 인스턴스 변수를 사용하면 됩니다!

 

 

 

 

 

 

 

'자바 (ref. 자바의정석)' 카테고리의 다른 글

생성자 (Constructor) - JAVA  (0) 2022.02.15
오버로딩(overloading) - JAVA  (0) 2022.02.14
배열의 복사 - JAVA  (0) 2022.02.08
for each 문 - JAVA  (0) 2022.02.07
문자열의 비교 - JAVA  (0) 2022.02.06