본문 바로가기

LANGUAGE/Java

Static

Java에서 static은 클래스 수준의 키워드로 사용되며, static으로 선언된 멤버(필드 또는 메서드)는 인스턴스가 아닌 클래스 자체에 속한다. static 멤버는 클래스가 로드될 때 생성되며, 모든 인스턴스가 공유하는 하나의 복사본이 있다.

static 변수는 정적필드, static 메서드는 정적메소드라고 부르기도 한다. 정적필드와 정적 메소드는 인스턴스에 소속된 멤버가 아니라 클래스에 고정된 멤버이기 때문에 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재하고 클래스별로 관리된다. 따라서 클래스 로딩이 끝나면 바로 사용할 수 있다.

static 키워드는 다음과 같은 경우에 사용된다.

  1. static 필드: static 키워드로 선언된 필드는 클래스 수준의 필드이며, 인스턴스를 생성하지 않고도 사용할 수 있다. static 필드는 클래스의 모든 인스턴스에서 동일한 값을 가지며, 인스턴스 간에 값을 공유할 수 있다.

     public class MyClass {
         public static int count; // static 필드
    
         public void increment() {
             count++;
         }
     }
    
  2. static 메서드: static 키워드로 선언된 메서드는 인스턴스가 아닌 클래스에 속한다. static 메서드는 클래스의 인스턴스를 생성하지 않고도 호출할 수 있다. 또한, static 메서드 내에서는 this 키워드를 사용할 수 없다.

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

    static 메서드에서는 인스턴스 변수 접근이 불가능하다. 예를들어 아래의 경우:

     public class MathUtils {
             int c;
         public static int add(int a, int b) {
                     c = 1; // 인스턴스 변수 c에 접근해서 1을 할당
             return a + b;
         }
     }

    static 메서드에서 인스턴스 변수 c에 접근할 수 없다. 반대로 인스턴스 메서드에서는 static 변수를 사용할 수 있다.

     public class MathUtils {
             static int c;
         public static int add(int a, int b) {
                     c = 1; // 인스턴스 변수 c에 접근해서 1을 할당
             return a + b;
         }
     }

    c에 접근하기 위해서는 c도 static 변수로 정의하면 된다.

static 멤버의 사용 사례:

  • 유틸리티 클래스: static 메서드로만 구성된 유틸리티 클래스를 생성해서 사용할 수 있다. 이러한 클래스는 인스턴스화하지 않고도 다양한 곳에서 유틸리티 메서드를 호출할 수 있다.
  • 상수: static final로 선언된 필드는 상수로 간주되며, 여러 인스턴스에서 공유된다.
  • 메모리 절약: static 필드는 모든 인스턴스가 공유하므로, 여러 인스턴스에서 동일한 값을 유지해야 할 때 메모리를 절약할 수 있다.
  • 정적 팩토리 메서드: static 메서드를 사용하여 클래스의 인스턴스를 생성하고 반환하는 정적 팩토리 메서드를 구현할 수 있다.
  • 내부 클래스: 내부 클래스에서 static 키워드를 사용하면 외부 클래스의 인스턴스에 대한 참조 없이도 내부 클래스의 인스턴스를 생성할 수 있다.
  • 효율 향상 : 메소드 내에서 인스턴스 변수를 사용하지 않으면 메소드 호출시간이 짧아지기 때문에 static을 붙이는 것을 고려할 수 있다.

static 멤버는 주의해서 사용해야 한다. 너무 많은 static 멤버를 사용하면 객체 지향 프로그래밍의 장점을 상실할 수 있고, 유지 관리와 테스트에

어려움을 겪을 수 있습니다. 또한 Garbage Collector의 관리 밖 영역에 존재하기 때문에 남발하면 성능에 악영향을 줄 수 있다. 적절하게 사용하면 유용한 기능이지만, 필요한 경우에만 사용하는 것이 좋다.

사용 지침

  • 클래스의 멤버변수중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 보고 있다면 static을 붙여준다.
  • 작성한 메소드 중 인스턴스 변수를 사용하지 않는 메소드에 대해서 static을 붙일 것을 고려한다.

Reference

[Java] static 변수와 static 메소드

'LANGUAGE > Java' 카테고리의 다른 글

내부 클래스(Inner Class)  (0) 2024.05.16