static

hoon·2025년 1월 13일

JAVA

목록 보기
4/21

static 키워드

  • static은 자바에서 클래스 레벨에서 멤버(변수와 메서드)를 선언할 때 사용하는 키워드로, 객체의 인스턴스와 관계없이 클래스에 종속되는 멤버를 정의하는 데 사용됩니다.

1. static의 의미

  • 클래스 레벨에서 공유되는 멤버를 정의할 때 사용.
  • 객체를 생성하지 않고도 접근 가능.
  • static 멤버는 클래스 로드 시 메모리에 할당되며, 모든 객체가 공유합니다.

2. static의 적용 대상

(1) static 변수

  • 클래스 변수라고도 하며, 클래스에 소속된 변수입니다.
  • 모든 객체가 공유하며, 하나의 메모리 공간을 사용합니다.
class Counter {
    static int count = 0; // static 변수

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

public class Main {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter c3 = new Counter();

        System.out.println(Counter.count); // 3 출력
    }
}
  • 특징:
    1. 객체에 속하지 않고 클래스에 속함.
    2. 모든 객체가 공유하는 값.

(2) static 메서드

  • 클래스 메서드라고도 하며, 객체를 생성하지 않고 호출할 수 있습니다.
  • static 변수만 접근 가능하며, 인스턴스 변수는 사용할 수 없습니다.
class MathUtil {
    static int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        // static 메서드는 클래스 이름으로 호출
        System.out.println(MathUtil.add(5, 10)); // 15 출력
    }
}
  • 특징:
    1. 객체를 생성하지 않고 호출 가능.
    2. 인스턴스 변수나 인스턴스 메서드에는 접근할 수 없음.

(3) static 블록

  • 클래스가 로드될 때 한 번만 실행되는 블록입니다.
  • 주로 static 변수의 초기화에 사용됩니다.
class StaticBlockExample {
    static int num;

    // static 블록
    static {
        num = 100;
        System.out.println("Static block executed.");
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(StaticBlockExample.num); // Static block executed. 100 출력
    }
}
  • 특징:
    1. 클래스 로드 시 자동 실행.
    2. static 변수 초기화나 설정 작업에 적합.

(4) static 클래스

  • 중첩 클래스(Nested Class)에서 사용되며, 정적 중첩 클래스를 정의할 때 사용됩니다.
  • static 클래스는 외부 클래스의 인스턴스와 독립적으로 사용 가능합니다.
class OuterClass {
    static class StaticNestedClass {
        void display() {
            System.out.println("Static Nested Class");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        // Static Nested Class의 인스턴스 생성
        OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();
        nested.display(); // Static Nested Class 출력
    }
}

3. static의 주요 특징

(1) 메모리 관리

  • static 변수와 메서드는 JVM의 메서드 영역(Method Area)에 저장됩니다.
  • 클래스가 로드될 때 한 번 메모리에 올라가며, 프로그램 종료 시까지 유지됩니다.

(2) 클래스 레벨 공유

  • static 멤버는 클래스 로드 시 초기화되며, 클래스의 모든 인스턴스가 공유합니다.

(3) 객체와 독립적

  • static 멤버는 객체의 상태와 무관하게 작동합니다.
  • 따라서 객체를 생성하지 않고도 클래스 이름으로 직접 호출할 수 있습니다.

4. static의 장단점

장점

  1. 메모리 절약:
    • static 변수는 한 번 메모리에 올라가고 모든 객체가 공유하므로 메모리를 절약할 수 있습니다.
  2. 객체 생성 없이 사용 가능:
    • 유틸리티 클래스(예: Math 클래스)의 기능을 객체 없이 사용할 수 있습니다.
  3. 클래스 간 데이터 공유:
    • 여러 객체 간에 공통된 데이터를 공유할 때 유용합니다.

단점

  1. 캡슐화 저하:
    • static 멤버는 클래스 간의 데이터를 공유하기 때문에, 무분별한 사용은 데이터 관리와 유지보수를 어렵게 만들 수 있습니다.
  2. 동적 다형성 미지원:
    • static 메서드는 오버라이딩되지 않으므로, 다형성을 지원하지 않습니다.
  3. 메모리 누수 가능성:
    • 프로그램 종료 시까지 메모리에 남아 있기 때문에 과도하게 사용하면 메모리 누수의 위험이 있습니다.

5. static의 주의사항

  1. static 메서드 내에서 인스턴스 멤버 접근 금지:

    • static 메서드는 객체와 무관하게 실행되므로, 인스턴스 멤버(변수, 메서드)에 직접 접근할 수 없습니다.
    class Example {
        int instanceVar = 10;
    
        static void staticMethod() {
            // System.out.println(instanceVar); // 컴파일 에러
        }
    }
    
  2. this와 super 사용 불가:

    • static 컨텍스트에서는 객체와 관련된 thissuper 키워드를 사용할 수 없습니다.

6. static 메서드와 다형성

static 메서드는 클래스 레벨에서 호출되므로 오버라이딩되지 않습니다.

다형성은 인스턴스 메서드에서만 적용됩니다.

예제

class Parent {
    static void display() {
        System.out.println("Parent static method");
    }
}

class Child extends Parent {
    static void display() {
        System.out.println("Child static method");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent obj = new Child();
        obj.display(); // Parent static method 출력
    }
}
  • Parent obj = new Child();로 선언했지만, static 메서드는 참조 변수의 타입에 따라 호출됩니다.

7. static의 실무 활용

  1. 유틸리티 클래스:

    • Math, Arrays, Collections 등 자바의 기본 라이브러리에서 static 메서드를 활용.
    int max = Math.max(10, 20); // Math 클래스의 static 메서드 호출
    
  2. 상수 정의:

    • static final 키워드로 상수를 정의.
    class Constants {
        static final double PI = 3.14159;
    }
    System.out.println(Constants.PI); // 3.14159
    
  3. 공유 데이터:

    • 여러 객체 간의 공유 데이터 관리를 위한 static 변수 사용.
    class SharedData {
        static int count = 0;
    }
    

8. 결론

  • static은 클래스 레벨에서 멤버를 정의하며, 객체를 생성하지 않고도 사용 가능한 편리한 기능입니다.
  • 효율적인 메모리 사용과 간편한 호출이 가능하지만, 과도한 사용은 유지보수를 어렵게 할 수 있습니다.
  • 적절한 상황(공유 데이터, 유틸리티 클래스 등)에서 사용하는 것이 중요합니다.

9. 요약

항목특징
static 변수모든 객체가 공유, 클래스 로딩 시 초기화. 예: Teller.genNum.
static 메서드객체 생성 없이 호출 가능, 인스턴스 멤버에 접근 불가. 예: Utility.printWelcomeMessage().
static 블록클래스 로딩 시 실행, 초기화 작업에 유용. 예: 번호표 준비 메시지 출력.

0개의 댓글