JUST WRITE

Static 본문

Programing/Java

Static

천재보단범재 2021. 9. 24. 11:26

Static

Static

사전적으로 정적이라는 의미를 가지고 있다.

Java에서 static 키워드를 변수, Method, block에 사용할 수 있다.

이번 글에서 적용하는 방법과 이유에 대해 정리해보았다.

 

static 키워드를 사용하면 인스턴스 멤버가 아닌 Class에 고정된 멤버가 된다.

인스턴스 멤버가 적재되는 Heap Memory가 아닌 다른 JVM Memory 공간에 적재된다.

(Java 8 이상 Metaspace, 8 아래는 Permanent Generation(PermGen) 공간에 적재)

 

Static Field

public class Car {
    private String name;
    private String engine;
    
    public static int numberOfCars; // Static Field
    
    public Car(String name, String engine) {
        this.name = name;
        this.engine = engine;
        numberOfCars++;
    }

    // getters and setters
}

Static Field를 사용할 경우는 아래 2가지로 정리할 수 있다.

  • 인스턴스에 종속적인 field가 아닌 경우
  • 모든 인스턴스에 공유되어야 할 field인 경우

Static Field는 Class 레벨에서 정의된다.

인스턴스의 생성 없이 Class명으로 바로 접근이 가능하다.


Static Method

// Static Method
public static void setNumberOfCars(int numberOfCars) {
    Car.numberOfCars = numberOfCars;
}

Static Method를 사용할 경우는 아래 2가지로 정리할 수 있다.

  • 인스턴스에 상관없이 Static Field나 다른 Static Method를 접근해야 될 경우
  • 보통 utility나 helper Class에서 사용

특징

  • Static Method는 Compile Time에 Memory에 올라가므로 Overriding이 불가능
  • Abstract Class에서 Static Method를 정의 불가능
  • Static Method에서 'this', 'super' 키워드를 사용 불가능
  • Static Method에서 인스턴스 변수나 Method에 직접 접근 불가능

Static Block

public class StaticBlockDemo {
    public static List<String> ranks = new LinkedList<>();
	
    // Static Block
    static {
        ranks.add("Lieutenant");
        ranks.add("Captain");
        ranks.add("Major");
    }
    
    // Static Block
    static {
        ranks.add("Colonel");
        ranks.add("General");
    }
}

Static block은 Static Field를 초기화할 때 사용한다.

Static Field 초기화는 정의하면 가능하지만, 약간의 logic이 필요한 경우 Static Block를 활용한다.

Static Class

public class Singleton  {    
    private Singleton() {}
    
    // Static Class
    private static class SingletonHolder {    
        public static final Singleton instance = new Singleton();
    }    

    public static Singleton getInstance() {    
        return SingletonHolder.instance;    
    }    
}

Java에서는 Class 안에 Class 선언이 가능하다.

Class 안에 선언된 Class를 Inner Class라 하는데, Inner Class에 Static 키워드를 사용할 수 있다.

특징

  • Group한 Class들을 한 곳에 모아 놓을 수 있어 캡슐화 증가
  • Outer Class가 굳이 인스턴스 멤버에 접근 안해도 된다면 Static Class로 Static 멤버들을 Control
    • 인스턴스를 굳이 생성 안함으로써 Heap Memory 사용 절감



[참고사이트]

728x90
반응형

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

Immutable Objects  (0) 2021.09.25
Wrapper Class  (0) 2021.09.24
접근 제어자  (0) 2021.08.26
OOP  (0) 2021.08.25
Java 특징  (0) 2021.08.22
Comments