본문 바로가기
개인공부

클래스 변수, 인스턴스 변수, 지역 변수 정리

by 리승우 2022. 12. 6.

변수의 종류

변수의 선언된 위치에 따라 멤버변수 지역변수로 나뉘고 멤버변수 중 static이 붙은 것은 클래스변수(static변수, 공유변수), 붙지 않은 것은 인스턴스변수이다.

 

class Person {
    
    int age; // 인스턴스 변수
    static int countryCode; // 클래스 변수

    void isPretty(){
        boolean goodLooking = true; // 지역변수
    }
}

 

인스턴스 변수, 클래스 변수

인스턴스변수와 클래스변수는 모두 클래스 영역에서 선언된다.

 

인스턴스변수

  • 클래스의 인스턴스를 생성할 때 만들어진다.
  • 인스턴스마다 독립적인 저장공간을 가지므로 인스턴스마다 서로 다른 값을 가질 수 있다.

클래스변수

  • 클래스가 메모리에 올라갈 때 생성되며 프로그램이 종료될 때까지 유지된다.
  • 모든 인스턴스가 공통된 저장공간(변수)를 공유하므로 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우 클래스변수로 선언한다.
  • 인스턴스를 생성하지 않아도 '클래스이름.클래스변수'와 같은 형식으로 사용한다.
  •  public을 붙이면 프로그램 내 어디서나 접근 가능한 전역변수(global variable)로 사용하 수 있다.

 

[핵심내용]

인스턴스 변수

> 인스턴스가 생성될 때마다 생성되므로, 인스턴스마다 각기 다른 값을 유지할 수 있다.

 

클래스 변수

> 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.

 

 

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에서도 자동완성을 시켜주지도 않을뿐더러 인스턴스 변수로 오해하기 쉽기 때문이다.

 

[핵심결론]

클래스에서 공통된 속성을 가진다고 생각되면 클래스 변수로,

각각 독립된 값을 가지면 인스턴스 변수를 사용하면 됩니다!

 

 

지역 변수

메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸된다.

for문, while문, if문 등 블럭 내에 선언된 지역변수는 블럭을 벗어나면 소멸되어 사용할 수 없게 된다.

'개인공부' 카테고리의 다른 글

객체지향 4가지 특징 정리 (OOP)  (0) 2022.12.12
메서드 (Method) 정리  (0) 2022.12.10
클래스 / 객체 / 인스턴스 정리  (0) 2022.12.06
2022.12.06 TIL (hibernate naming)  (0) 2022.12.06
2022.12.06 TIL  (0) 2022.12.06

댓글