[CS] 클래스 멤버의 static

khj·2025년 1월 24일

Computer Science

목록 보기
16/25
post-thumbnail

1. static 키워드란?

static은 클래스 멤버(변수나 메서드)를 정의할 때 사용되는 키워드로, 해당 멤버가 클래스 수준에서 공유되도록 합니다. 즉, static 멤버는 객체 인스턴스에 종속되지 않고 클래스 자체에 속합니다. 이를 통해 메모리 사용을 효율적으로 관리하고, 공통된 값을 여러 인스턴스에서 공유할 수 있습니다.

2. static 멤버의 특징

  • 클래스에 속함
    • static으로 선언된 멤버는 특정 객체가 아닌 클래스 자체에 속합니다.
    • 클래스가 메모리에 로드될 때 생성됩니다.
  • 공유 메모리
    • 모든 객체가 같은 static 멤버를 공유합니다.
    • 값이 변경되면 이를 공유하는 모든 객체에서 영향을 받습니다.
  • 인스턴스 없이 접근 가능
    • 객체를 생성하지 않고도 클래스 이름을 통해 static 멤버에 접근할 수 있습니다.

3. static 멤버의 종류

static 변수

  • 클래스 전체에서 공유되는 변수입니다.
  • 클래스가 로드될 때 메모리에 할당되며, 프로그램 종료 시까지 유지됩니다.
  • 모든 인스턴스에서 같은 값을 참조합니다.
public class StaticExample {
    static int sharedCounter = 0;

    public static void incrementCounter() {
        sharedCounter++;
    }
}

static 메서드

  • 클래스에 속하는 메서드로, 인스턴스 멤버에 접근할 수 없습니다.
  • 객체와 무관하게 동작해야 하는 로직에 유용합니다.
public class StaticExample {
    static int counter = 0;

    public static void printCounter() {
        System.out.println("Counter: " + counter);
    }
}

static 블록

  • 클래스가 로드될 때 한 번만 실행되는 초기화 블록입니다.
  • 복잡한 초기화 작업을 수행할 때 유용합니다.
public class StaticBlockExample {
    static int sharedValue;

    static {
        sharedValue = 42;
        System.out.println("Static block executed");
    }
}

4. 예제: static 변수와 메서드 사용

다음 예제는 static 키워드의 실제 활용을 보여줍니다.

public class StaticExample {
    static int counter = 0; // 모든 인스턴스가 공유하는 변수

    public StaticExample() {
        counter++;
    }

    public static void printCounter() { // static 메서드
        System.out.println("현재 생성된 객체 수: " + counter);
    }

    public static void main(String[] args) {
        new StaticExample();
        new StaticExample();
        StaticExample.printCounter(); // 출력: 현재 생성된 객체 수: 2
    }
}

5. static의 장점과 단점

장점

  • 메모리 효율성: 클래스 수준에서 메모리를 공유하므로, 메모리 낭비를 줄일 수 있습니다.
  • 객체 독립성: 특정 객체에 종속되지 않으므로, 객체 없이도 호출할 수 있습니다.
  • 공통 데이터 관리: 여러 객체 간에 데이터를 공유하고 관리하기에 적합합니다.

단점

  • 유연성 제한: static 멤버는 객체 인스턴스에 종속되지 않으므로 다형성을 활용하기 어렵습니다.
  • 스레드 안전성: 여러 스레드에서 동시에 접근하면 동기화 문제가 발생할 수 있습니다.
  • 테스트 어려움: 공통 데이터 관리로 인해 테스트가 복잡해질 수 있습니다.

6. 언제 static을 사용할까?

공유 데이터가 필요한 경우

  • 특정 데이터가 모든 객체에서 동일하게 유지되어야 할 때.
  • 예: 전역 카운터, 설정 값

독립적인 유틸리티 메서드

  • 객체 상태와 무관하게 동작하는 메서드에 유용.
  • 예: Math 클래스의 Math.max(), Math.sqrt() 등

고정된 상수 값

  • 값이 변하지 않는 상수는 static과 final을 함께 사용하여 선언.

7. static을 남용하면 안 되는 이유

  • 객체지향 원칙 위배: static 멤버는 객체 상태와 무관하므로, 객체지향 프로그래밍의 철학과 어긋날 수 있습니다.
  • 테스트 복잡성 증가: 공유 상태가 많아지면 테스트 코드 작성이 어려워질 수 있습니다.
  • 메모리 누수 가능성: static 멤버는 클래스 로드가 해제되지 않는 한 계속 메모리에 남아 있습니다.
profile
Spring, Django 개발 블로그

0개의 댓글