본문 바로가기
Java

Static 키워드 알아보기

by GGShin 2022. 5. 12.

안녕하세요!

오늘은 static 이라는 키워드에 대해서 알아보고자 합니다.

먼저 간략하게 특징을 정리해보자면,

 

- 용도: 특정한 class에서 공통으로 사용하는 variables나 methods에 붙임. 메모리 관리를 위함.
- 사용 위치: variables, methods, blocks, and nested classes
- 특징: class의 instance 보다는 class 자체에 속함. 동일한 class의 instance들이 공유하는 constant variable 이나 method에 사용.
출처: https://www.geeksforgeeks.org/static-keyword-java/

이렇게 정리될 수 있겠습니다. 그런데 이렇게만 보니 무슨 말인지 잘 모르겠더라구요 ㅎㅎ

제가 지금까지 이해한 바로는 static 키워드를 붙이면 "공용"*이 된다고 보면 될 것 같습니다. 하나의 class로 여러 instance를 만들 수 있는데, static이 붙어있는 fields는 한 class를 이용해 만들어진 모든 instances들이 공유하게 됩니다. 예를 들어서 보겠습니다.

*비슷한 뉘앙스로 들리는 게 public이 있지만, public은 접근 제어자(access modifier)인 반면에 static은 접근제어자는 아닙니다(non-access modifier).  

 

class TestClass {
    //static field
    static int numberOfInstances;
    //non-static field
    String nameOfInstance;

    //constructor
    public TestClass(String nameOfInstance) {
        this.nameOfInstance = nameOfInstance;
    }
}

위의 TestClass와 해당 클래스로 생성한 instance들의 데이터 관계를 도표로 그려보았습니다. 

testClass1, 2, 3 모두 static field의 value는 공유하고 있습니다. 반면에 non-static field는 각각의 instance에 속해있는 것을 볼 수 있습니다. 위에서 언급했던 static의 특징인 "class의 instance 보다는 class 자체에 속함"이 어떠한 의미인지 이제 좀 와닿으시죠?

 

numberOfInstance는 static variable이기 때문에 어떤 instance로 접근해도 같은 값을 반환합니다. 

 

현재 상태에서는 

testClass1.numberOfInstances; // 0

testClass2.numberOfInstances; // 0

testClass3.numberOfInstances; // 0

일 것입니다. 

 

Static의 또 다른 특징은 class의 object가 생성되기 전에도 접근이 가능하다는 점입니다. (instance가 아닌 Class에 속해있으니 당연히 그렇겠죠?) 이는 compile-time 또는 early binding*을 사용하기 때문이라고 합니다. (non-static의 경우 runtime 또는 dynamic binding입니다.)

When a member is declared static, it can be accessed before any objects of its class are created, and without reference to any object.

이러한 특징 때문에 static method는 오로지 class 내외부의 static한 member들이나 methods만 접근할 수 있다는 특성이 있습니다. Static하기 때문에 instance가 없이도 사용이 가능한데, non-static memeber나 methods는 instance가 생성된 후에야 활동이 가능하므로 static이 non-static에 접근이 불가능한 상황이 생길 수가 있기 때문입니다. 

반대로 non-static method는 static과 non-static 모두에 접근할 수 있습니다. 

 

*early binding이 되기 때문에 static methods는 override가 불가능합니다. Overriding은 runtime polymorphism이 필요하기 때문인데, 그래서 non-static인 method만 가능합니다.

 

Static blocks

Static을 사용하는 대상 중에 block이 있었는데, block이 어떤 것인지, block에 static이 어떻게 사용되는 건지 좀 더 자세히 알아보고자 공부를 해보았습니다. 

먼저, static block은 static field를 initialize 할 때 사용합니다.

static int a = 10;
static int b;

 

위에 static으로 선언된 int fields가 두개 있습니다. a는 생성이 완료된 반면 b는 아직 선언만 되어있죠?

이때, static field를 initialize 하기 위해서 static block을 사용할 수 있습니다. 

 

static {
	b = a * 4;
}

이렇게 해주면 b에는 a에 4를 곱한 값인 40이 할당됩니다. 

a를 instantiate 한 것 처럼 하면 되는데 왜 static을 사용할까요? 이 예시에서는 상당히 단순한 연산이 행해졌지만,  더욱 복잡한 식이 들어가게 되는 경우가 있는데 그럴 때에 사용하기 좋다고 합니다. 

 

왜 static block을 사용하는가에 대한 답변은 아래 링크를 참고하였습니다.

https://www.quora.com/What-is-the-use-of-a-static-block-in-Java

 

What is the use of a static block in Java?

Answer (1 of 5): Just so we’re clear what a static block is, it’s like a static field, but is a block that can contain an arbitrary number of lines of code. Just as static fields are initialized when the class is loaded into the JVM, static initializer

www.quora.com

 

여기까지 static 키워드에 대해서 알아보았습니다. 처음에는 많이 혼란스러웠는데, 개념을 정리하다 보니 어느 정도 이해가 되는 것 같습니다. ☺️ 

 

 

*참고자료:

 

https://www.geeksforgeeks.org/static-keyword-java/

(Static block에 대한 내용도 나와있음!)

 

static Keyword in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://www.geeksforgeeks.org/g-fact-47/

 

Are static local variables allowed in Java? - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

반응형

'Java' 카테고리의 다른 글

Generics(제네릭)의 의미와 사용법  (0) 2022.05.18
Final 키워드 알아보기  (0) 2022.05.16
Inner Class - Anonymous class(익명 클래스)  (0) 2022.05.10
Inner class - local class  (0) 2022.05.09
Inner class 알아보기  (0) 2022.05.09