[Java] Multithreading - Static Keyword

반응형

이번 글에서는 static keyword에 대해 알아보도록 하겠습니다.

1. Static Keyword

java에서 static 변수는 class 단위로 값을 할당할때 사용할 수 있습니다. 😎

1-1) by object

예를 들어 아래와 같이 Emp Class가 있다고 가정해보겠습니다. 또한, 모든 ceo 변수의 값은 "suwon"이라고 가정하겠습니다.

class Emp {
    int id;
    int salary;
    String ceo;
}

위의 클래스를 사용한 main 함수가 아래와 같을때

public class Demo {
    public static void main(String[] args) {
        Emp minho = new Emp();
        minho.id = 8;
        minho.salary = 4000;
        minho.ceo = "suwon";

        Emp subaek = new Emp();
        subaek.id = 9;
        subaek.salary = 5000;
        subaek.ceo = "suwon";
    }
}

minho와 subaek 객체를 생성하면 아래와 같이 stack 영영과 heap 영역이 구성되게 됩니다.

위와 같이 구성했을때 ceo가 변경된 경우, 모든 object의 변수들을 일일이 변경해야 하는 번거로움이 발생하게 됩니다.

1-2) by class

이때 static keyword를 사용하면, 모든 object의 ceo 변수의 값을 동일하게 지정할 수 있습니다.

class Emp {
    int id;
    int salary;
    static String ceo;

    static {
       ceo = "suwon";
    }
}

static으로 선언된 ceo 변수는 static 블록안에서 초기화하며, heap 영역이 아닌 method area 영역에 올라가게 됩니다.

모든 object는 class를 사용해 instance를 생성하기 전에 'Class Loader'를 사용해 JVM 내의 'Method Area'에 load 되는 과정을 거칩니다.

이후 method area 영역에 올라간 변수의 값을 모든 object가 공유하게 되는 것입니다.

위와 같이 변경한 경우 object 별로 변수값을 할당할 필요가 없어집니다.

public class Demo {
    public static void main(String[] args) {
        Emp minho = new Emp();
        minho.id = 8;
        minho.salary = 4000;
        // minho.ceo = "Suwon";

        Emp subaek = new Emp();
        subaek.id = 9;
        subaek.salary = 5000;
        // subaek.ceo = "Suwon";
    }
}

또한, object를 생성하지 않더라도 static 변수 & 메서드에는 class 를 통해 직접 접근할 수 있습니다.

public class Demo {
    public static void main(String[] args) {
    // "suwon"
         System.out.println(Emp.ceo);
    }
}

Emp가 호출되는 순간에 이미 Method Area에 ceo 값이 올라가게 되므로, 객체를 생성하지 않더라도 변수값에 접근할 수 있는 것 입니다.

1-3) cannot reach

주의사항으로는 static block 내부에서 non-static 변수에 접근할 수 없습니다.

public class Demo {
    int i = 10;
    public static void main(String[] args) {
    // error
         System.out.println(i);
    }
}

non-static 변수는 object instance 생성 후 heap 영역에 load 되므로, instance 생성 없이 접근할 수 있는 static block 내부에서 non-static 변수에 접근할 경우 에러가 발생하게 됩니다. 😅

• static variables are same for all the objects
• non-static variables are different for all the objects
• cannot use non-static variable in static block


추천서적

 

이것이 자바다:신용권의 Java 프로그래밍 정복

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

댓글

Designed by JB FACTORY