Java에서 static 키워드

Java에서의 static 키워드는 자바 프로그래밍에서 자주 사용됩니다. 자바의 static 키워드는 클래스 레벨 변수를 생성하는 데 사용됩니다. static 변수와 메소드는 클래스의 일부이며, 클래스의 인스턴스가 아닙니다.

Java에서의 static 키워드

Java static 키워드는 아래 이미지에 표시된 다섯 가지 경우에 사용될 수 있습니다. 여기에서는 그 중 네 가지를 다룰 것입니다. 다섯 번째 경우는 Java 8에서 도입되었으며, 그에 대한 설명은 Java 8 인터페이스 변경에서 이루어집니다.

  1. 자바 정적 변수

    우리는 클래스 레벨 변수에 static 키워드를 사용할 수 있습니다. 정적 변수는 클래스 변수이며 클래스의 객체/인스턴스에 속하지 않습니다. 정적 변수는 객체의 모든 인스턴스와 공유되기 때문에 스레드 안전하지 않습니다. 보통 정적 변수는 모든 객체에서 사용할 수 있는 공통 리소스나 상수에 final 키워드와 함께 사용됩니다. 정적 변수가 private이 아닌 경우에는 ClassName.variableName으로 접근할 수 있습니다.

        //정적 변수 예시
        private static int count;
        public static String str;
        public static final String DB_USER = "myuser";
    
  2. Java 정적 메소드

    정적 변수와 마찬가지로, 정적 메소드는 클래스에 속하며 클래스의 인스턴스에 속하지 않습니다. 정적 메소드는 클래스의 정적 변수에만 접근하고 클래스의 정적 메소드만 호출할 수 있습니다. 일반적으로, 정적 메소드는 인스턴스를 생성하지 않고 다른 클래스에서 사용할 수 있도록 노출시키고자 하는 유틸리티 메소드입니다. 예를 들어 Collections 클래스, Java Wrapper 클래스 및 유틸리티 클래스에는 많은 정적 메소드가 포함되어 있습니다. 자바 프로그램의 진입점인 main() 메소드 자체도 정적 메소드입니다.

        //정적 메소드 예제
        public static void setCount(int count) {
            if(count > 0)
            StaticExample.count = count;
        }
        
        //정적 유틸리티 메소드
        public static int addInts(int i, int...js){
            int sum=i;
            for(int x : js) sum+=x;
            return sum;
        }
    

    Java 8부터는 인터페이스에도 정적 메소드를 가질 수 있습니다. 자세한 내용은 Java 8 인터페이스 변경점을 참조하십시오.

  3. 자바 정적 블록

    자바 정적 블록은 클래스가 자바 클래스로더에 의해 메모리에 로드될 때 실행되는 명령문의 그룹입니다. 정적 블록은 클래스의 정적 변수를 초기화하는 데 사용됩니다. 주로 클래스가 로드될 때 정적 리소스를 생성하는 데 사용됩니다. 정적 블록에서는 비정적 변수에 접근할 수 없습니다. 클래스에 여러 개의 정적 블록을 가질 수 있지만, 그렇게 하는 것은 큰 의미가 없습니다. 정적 블록 코드는 클래스가 메모리에 로드될 때 한 번만 실행됩니다.

        static{
            // 클래스가 로드될 때 리소스를 초기화하는 데 사용할 수 있음
            System.out.println("StaticExample static block");
            // 정적 변수와 메서드에만 접근 가능
            str="Test";
            setCount(2);
        }
    
  4. Java 정적 클래스

    중첩 클래스에 static 키워드를 사용할 수 있습니다. static 키워드는 최상위 클래스에는 사용할 수 없습니다. 정적 중첩 클래스는 다른 최상위 클래스와 동일하며, 패키징 편의성을 위해 중첩됩니다. 읽기: Java 중첩 클래스

자바에서 static 키워드의 사용법을 샘플 프로그램에서 확인해 봅시다. StaticExample.java

package com.journaldev.misc;

public class StaticExample {

    // static 블록
    static{
        // 클래스가 로드될 때 리소스를 초기화하는 데 사용될 수 있음
        System.out.println("StaticExample static block");
        // static 변수와 메소드만 접근 가능
        str="Test";
        setCount(2);
    }
    
    // 동일 클래스에서 여러 static 블록 사용 가능
    static{
        System.out.println("StaticExample static block2");
    }
    
    // static 변수 예제
    private static int count; //kept private to control its value through setter
    public static String str;
    
    public int getCount() {
        return count;
    }

    // static 메소드 예제
    public static void setCount(int count) {
        if(count > 0)
        StaticExample.count = count;
    }
    
    // static 유틸 메소드
    public static int addInts(int i, int...js){
        int sum=i;
        for(int x : js) sum+=x;
        return sum;
    }

    // static 클래스 예제 - 단지 패키지 편의를 위해 사용
    public static class MyStaticClass{
        public int count;
        
    }

}

static 변수, 메소드 및 static 클래스를 테스트 프로그램에서 어떻게 사용하는지 알아봅시다. TestStatic.java

package com.journaldev.misc;

public class TestStatic {

    public static void main(String[] args) {
        StaticExample.setCount(5);
        
        // 비공개가 아닌 static 변수는 클래스 이름으로 접근 가능
        StaticExample.str = "abc";
        StaticExample se = new StaticExample();
        System.out.println(se.getCount());
        // 클래스와 인스턴스의 static 변수는 동일함
        System.out.println(StaticExample.str +" is same as "+se.str);
        System.out.println(StaticExample.str == se.str);
        
        // static 중첩 클래스는 일반 최상위 클래스와 동일
        StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
        myStaticClass.count=10;
        
        StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
        myStaticClass1.count=20;
        
        System.out.println(myStaticClass.count);
        System.out.println(myStaticClass1.count);
    }
    
}

위의 자바 static 키워드 예제 프로그램의 출력은 다음과 같습니다:

StaticExample static block
StaticExample static block2
5
abc is same as abc
true
10
20

static 블록 코드는 클래스가 메모리에 로드될 때 가장 먼저 실행되며 한 번만 실행됨을 주목하세요. 다른 출력은 자명합니다.

Java static import

보통 우리는 클래스 참조를 사용하여 정적 멤버에 접근합니다. 하지만 Java 1.5부터는 클래스 참조를 피하기 위해 자바 정적 임포트를 사용할 수 있습니다. 아래는 자바 정적 임포트의 간단한 예입니다.

package com.journaldev.test;

public class A {

	public static int MAX = 1000;
	
	public static void foo(){
		System.out.println("foo static method");
	}
}
package com.journaldev.test;

import static com.journaldev.test.A.MAX;
import static com.journaldev.test.A.foo;

public class B {

	public static void main(String args[]){
		System.out.println(MAX); //normally A.MAX
		foo(); // normally A.foo()
	}
}

정적 임포트를 위해 import 문을 사용할 때는 import static을 사용한 다음 클래스의 완전한 경로로 정적 멤버를 지정해야 합니다. 클래스의 모든 정적 멤버를 임포트하려면 import static com.journaldev.test.A.*;와 같이 *를 사용할 수 있습니다. 이를 사용하는 경우는 클래스의 정적 변수를 여러 번 사용할 때에만 사용해야 하며, 가독성을 위해 좋지 않습니다. 업데이트: 최근에 자바에서 정적 키워드를 설명하는 비디오를 만들었습니다. 아래에서 확인해주세요. https://www.youtube.com/watch?v=2e-l1vb\_fwM

Source:
https://www.digitalocean.com/community/tutorials/static-keyword-in-java