
Java의 static 키워드를 학습하고, 해당 키워드의 정의와 용례를 추가적으로 공부하였습니다.
클래스에 속하는 변수나 메서드를 선언하는 데 사용되며, 객체의 상태와 상관없이 공유된다.
클래스 변수
public class Example {
public static int sharedVar = 0;
}
클래스 메서드
public class Example {
public static void printMessage() {
System.out.println("Hello, Static Method!");
}
}
static 블록
클래스가 로드될 때 한 번 실행된다.
주로 초기화 작업을 수행할 때 사용된다.
사용 예시
// 선언과 동시에 초기화하기 어려운 경우, 복잡한 데이터 초기화하기 위해 사용.
public class Config {
public static final Map<String, String> SETTINGS;
static {
SETTINGS = new HashMap<>();
SETTINGS.put("URL", "https://example.com");
SETTINGS.put("PORT", "8080");
SETTINGS.put("TIMEOUT", "5000");
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Config.SETTINGS/get("URL"));
}
}
// 정적 리소스나 설정 데이터를 로드하는 경우. (초기화 과정에서 예외 처리 가능)
public class DatabaseConnection {
public static Connection connection;
static {
try {
// JDBC 드라이버 로드
Class.forName("com.mysql.cj.jdbc.Driver");
// 데이터베이스 연결
connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb", "user", "password");
System.out.println("Database connected!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
// 클래스 로드 시 이미 연결이 설정됨
System.out.println(DatabaseConnection.connection != null ? "Connection is ready" : "Connection failed");
}
}
static 중첩 클래스
- 클래스 내부에 선언된 중첩 클래스.
// 내부 구조 캡슐화 (외부 클래스의 인스턴스 없이 독립적인 동작이 필요)
public class OuterClass {
private static String staticMessage = "Hello, Static World!";
// 정적 중첩 클래스
public static class NestedClass {
public void printMessage() {
System.out.println(staticMessage);
}
}
}
public class Main {
public static void main(String[] args) {
// 외부 클래스 인스턴스 없이 정적 중첩 클래스 사용
OuterClass.NestedClass nested = new OuterClass.NestedClass();
nested.printMessage(); // 출력: Hello, Static World!
}
}
// 빌더 패턴 구현
public class Person {
private String name;
private int age;
// 정적 중첩 클래스: Builder
public static class Builder {
private String name;
private int age;
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setAge(int age) {
this.age = age;
return this;
}
public Person build() {
Person person = new Person();
person.name = this.name;
person.age = this.age;
return person;
}
}
}
public class Main {
public static void main(String[] args) {
// Builder를 사용하여 객체 생성
Person person = new Person.Builder()
.setName("John Doe")
.setAge(30)
.build();
System.out.println(person); // 출력: Person@주소값
}
}
Race Condition과 같은 문제가 발생할 수 있다.