[Java] static

지민·2025년 1월 12일

LG CNS Inspire Camp 1기

목록 보기
4/5
post-thumbnail

Java의 static 키워드를 학습하고, 해당 키워드의 정의와 용례를 추가적으로 공부하였습니다.

static

클래스에 속하는 변수나 메서드를 선언하는 데 사용되며, 객체의 상태와 상관없이 공유된다.

static이 붙을 수 있는 대상

  1. 클래스 변수

    • 클래스에 속하며, 모든 인스턴스가 공유된다.
    • 객체마다 별도로 생성되지 않으며, 클래스 로딩 시 한 번만 메모리에 올라간다.
    public class Example {
     	public static int sharedVar = 0;
    }
  2. 클래스 메서드

    • 객체의 상태와 상관없이 실행되는 메서드.
    • 인스턴스 멤버에 직접 접근할 수 없다.
    public class Example {
        public static void printMessage() {
            System.out.println("Hello, Static Method!");
        }
    }
  3. 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");
            }
        }
  4. 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@주소값
             }
         } 

주의사항

  1. 인스턴스 멤버 접근 불가
  2. Thread Safety
    static 변수는 클래스 로딩 시점에 메모리에 올라가며, 모든 스레드가 동일한 메모리 공간을 공유한다. 이로 인해 여러 스레드가 static 변수에 접근하여 읽기/쓰기 작업을 수행하면 데이터 불일치나 Race Condition과 같은 문제가 발생할 수 있다.

0개의 댓글