Java에서의 static 키워드는 자바 프로그래밍에서 자주 사용됩니다. 자바의 static 키워드는 클래스 레벨 변수를 생성하는 데 사용됩니다. static 변수와 메소드는 클래스의 일부이며, 클래스의 인스턴스가 아닙니다.
Java에서의 static 키워드
Java static 키워드는 아래 이미지에 표시된 다섯 가지 경우에 사용될 수 있습니다.
여기에서는 그 중 네 가지를 다룰 것입니다. 다섯 번째 경우는 Java 8에서 도입되었으며, 그에 대한 설명은 Java 8 인터페이스 변경에서 이루어집니다.
-
자바 정적 변수
우리는 클래스 레벨 변수에
static
키워드를 사용할 수 있습니다. 정적 변수는 클래스 변수이며 클래스의 객체/인스턴스에 속하지 않습니다. 정적 변수는 객체의 모든 인스턴스와 공유되기 때문에 스레드 안전하지 않습니다. 보통 정적 변수는 모든 객체에서 사용할 수 있는 공통 리소스나 상수에 final 키워드와 함께 사용됩니다. 정적 변수가 private이 아닌 경우에는ClassName.variableName
으로 접근할 수 있습니다.//정적 변수 예시 private static int count; public static String str; public static final String DB_USER = "myuser";
-
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 인터페이스 변경점을 참조하십시오.
-
자바 정적 블록
자바 정적 블록은 클래스가 자바 클래스로더에 의해 메모리에 로드될 때 실행되는 명령문의 그룹입니다. 정적 블록은 클래스의 정적 변수를 초기화하는 데 사용됩니다. 주로 클래스가 로드될 때 정적 리소스를 생성하는 데 사용됩니다. 정적 블록에서는 비정적 변수에 접근할 수 없습니다. 클래스에 여러 개의 정적 블록을 가질 수 있지만, 그렇게 하는 것은 큰 의미가 없습니다. 정적 블록 코드는 클래스가 메모리에 로드될 때 한 번만 실행됩니다.
static{ // 클래스가 로드될 때 리소스를 초기화하는 데 사용할 수 있음 System.out.println("StaticExample static block"); // 정적 변수와 메서드에만 접근 가능 str="Test"; setCount(2); }
-
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