Language/Java

[JAVA] private static final을 사용하는 이유

대기업 가고 싶은 공돌이 2023. 11. 18. 19:04

우리는 상수를 선언할 때 보통 private static final을 사용하여 선언한다.

 

private이 뭔지 static이 뭔지 final이 뭔지 간단히 짚어보도록 하겠다.

 

 

 

private이란?

 

private은 같은 클래스 내부에서만 사용 가능하도록 만드는 명령어이다.

 

public class MyClass {
    private int privateVariable;

    private void privateMethod() {
        // 이 메서드는 MyClass 내에서만 접근 가능
    }

    // 다른 멤버들...
}

 

다음과 같은 클래스가 있다고 했을 때

 

privateVariable이라는 변수와 private 메소드는 MyClass 내부에서만 사용이 가능하다.

 

그렇다면 static은 무엇일까

 

 

static이란?

 

static이란 선언한 변수나 메소드를 인스턴스 생성없이 사용할 수 있도록 만들어준다.

 

static을 선언하면 jvm의 static 메모리에 변수가 저장되어 모든 클래스에서 공유가 가능하도록 만들어준다.

 

그렇기 때문에 객체의 생성없이 사용할 수 있는 것이다.

 

public class MyClass {
    // 정적 변수
    static int staticVariable;

    // 인스턴스 변수
    int instanceVariable;
}

 

staticVariable은 객체 생성없이 MyClass.staticVarible로 접근할 수 있고

 

instanceVariable은 new MyClass()를 통한 객체 생성 이후 접근할 수 있다.

 

마지막으로 final은 무엇일까

 

final이란?

final이란 오직 한 번만 할당을 할 수 있다는 의미이다.

 

final int varialbe = 3;

variable = 500; //오류 발생

final int x[] = {10,100,1000};

x[0] = 500; //여기서는 오류가 발생하지 않음

 

x라는 배열에 객체를 할당해준 이후, x에 새로운 객체를 할당할 수는 없다.

하지만 x객체에 들어있는 값은 변경이 가능하다.

 

그렇다면 static final을 사용하는 이유는 무엇일까

 

final을 살펴보면 한 번만 할당한 이후 객체를 변경하지 않겠다는 의미로 사용하는 것이다.

 

static은 생성된 객체를 jvm static 메모리에 올려 전체에서 공유하겠다는 의미다.

 

그렇다면 static final로 선언을 해버리면 하나의 객체를 계속 재활용하여 메모리 낭비를 줄일 수 있다는 의미이다.

 

잘 이해가 안된다 예시를 살펴보자

public class MyClass {
    public final int instanceVariable;

    public MyClass(int value) {
        this.instanceVariable = value;
    }
}

public static void main(){
    MyClass obj1 = new MyClass(42);
    MyClass obj2 = new MyClass(99);

    System.out.println(obj1.instanceVariable);  // 출력: 42
    System.out.println(obj2.instanceVariable);  // 출력: 99
 }

 

다음과 같이 여러개의 객체를 생성하고 객체별로 각각 다른 값을 갖게 하려면 static을 사용하지 않는 것이 맞다.

 

하지만 모든 클래스 단위에서 똑같은 값을 공유하고 싶다면 객체의 낭비를 없게 하도록 다음과 같이 선언하는 것이

이득일 것이다.

public class MyClass {
	
    private static final MyClass mc = new MyClass();
    
    private MyClass(){}  //생성자를 불러서 MyClass 객체를 여러개 생성하지 못하도록 생성자도 제한했다.
	
    // static final 변수로 상수 정의
    public static final int CONSTANT_VALUE = 42;

}

 

이렇게 한다면 객체의 생성 없이도 접근이 가능하고, 하나의 객체를 static 메모리에 올려 공유함으로서

메모리 낭비도 줄일 수 있을 것이다.

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

[JAVA] Comparator 인터페이스의 이해  (0) 2024.08.09
Enum Type과 Embedded Type의 차이  (0) 2024.02.21