java static 좀 더 깊게 알아보기

728x90

 안녕하십니까. 오늘은 제가 강의를 들으며 헷갈렸던 static에 대해 알아보겠습니다.

 자바를 공부하다 보면 static 키워드가 붙은 변수나 메서드를 자주 보게 되는데, 이게 뭐가 특별한지 왜 사용되는지 제대로 이해하는 것이 중요합니다. static의 특징과 활용법을 하나씩 꼼꼼하게 정리해 보도록 하겠습니다.

1. Static 변수 (Static Variable) – 클래스 변수

 먼저, static 변수는 클래스에 속하는 변수입니다. 보통 클래스는 여러 개의 객체를 만들 수 있는데, static 변수는 그런 객체들과는 독립적으로 클래스에 딱 한 번만 생성됩니다. 즉, 모든 객체가 하나의 static 변수를 공유하는 구조입니다. 예를 들어 count라는 변수를 static으로 선언하면 이 변수는 같은 클래스를 사용하는 모든 객체가 공유합니다. 한 객체에서 값을 변경하면 다른 객체에서도 바뀐 값을 보게 됩니다.

public class MyClass {
    static int count = 0; // static 변수

    public MyClass() {
        count++; // 객체가 생성될 때마다 count 증가
    }
}

2. Static 메서드 (Static Method) – 객체 없이도 호출할 수 있는 메서드

 이제 static 메서드를 살펴보겠습니다. static 메서드는 클래스에 속하는 메서드로, 객체 없이 호출할 수 있습니다. 그래서 클래스명으로 바로 호출이 가능합니다. 단, 주의할 점은 static 메서드는 객체의 상태와 관련이 없는 메서드여야 한다는 것입니다. static 메서드는 인스턴스 변수나 인스턴스 메서드를 직접 사용할 수 없습니다.

 보통 유틸리티 메서드를 만들 때 주로 사용합니다. 인스턴스의 상태와 상관없이 어떤 값을 계산하거나 공통된 작업을 수행할 때 유용합니다.

public class MathUtils {
    public static int add(int a, int b) {
        return a + b;
    }
}

 위 예제의 add 메서드는 MathUtils.add(5, 10)처럼 객체를 만들지 않고도 호출할 수 있습니다.


3. Static 블록 (Static Block) – 클래스가 로드될 때 한 번만 실행되는 블록

 static 블록은 클래스가 메모리에 로드될 때 딱 한 번 실행되는 초기화 블록입니다. 클래스 로딩 시점에 설정이나 초기화가 필요할 때 유용합니다. static 블록이 여러 개 있으면 작성된 순서대로 실행되므로 참고하시기 바랍니다.

public class Example {
    static int count;

    static {
        count = 10; // static 변수 초기화
        System.out.println("Static block initialized.");
    }
}

 위 예제에서 Example 클래스가 로드되면 static 블록이 자동으로 실행되며 count 변수가 초기화됩니다.


4. Static 클래스 (Static Nested Class) – 독립적으로 사용할 수 있는 내부 클래스

 자바에서는 클래스 안에 또 다른 클래스를 정의할 수 있습니다. 이때 내부 클래스에 static을 붙이면 외부 클래스의 인스턴스와 독립적으로 동작하는 내부 클래스를 만들 수 있습니다. 주로 외부 클래스와 밀접한 관련이 있지만, 독립적으로도 사용할 수 있을 때 유용하게 쓰입니다.

public class OuterClass {
    static class InnerStaticClass {
        public void display() {
            System.out.println("Static Inner Class");
        }
    }
}

 이 경우 InnerStaticClass는 OuterClass의 인스턴스와 관계없이 독립적으로 사용할 수 있습니다. 외부 클래스의 인스턴스 없이도 OuterClass.InnerStaticClass inner = new OuterClass.InnerStaticClass();처럼 생성할 수 있습니다.


5. Static Import – 클래스명 없이 편하게 쓰기

 static 멤버가 많은 클래스가 있을 때, import static 구문을 사용하면 클래스명 없이 간편하게 사용할 수 있는 기능이 있습니다. 자주 쓰는 메서드나 상수를 편리하게 쓰기 위해 활용할 수 있습니다.

import static java.lang.Math.PI;
import static java.lang.Math.sqrt;

public class Test {
    public static void main(String[] args) {
        System.out.println(PI);        // Math.PI 대신 PI만 사용 가능
        System.out.println(sqrt(4));   // Math.sqrt 대신 sqrt만 사용 가능
    }
}

 이렇게 PI와 sqrt를 Math 클래스명 없이도 사용할 수 있습니다.

728x90
반응형
LIST