'

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [STUDY01] Static 변수 SingleTonPattern/궁금증
    FISA 2025. 12. 31. 18:39

     

    이번 주제의 궁금증은 

    ⁉️ final은 더이상 수정하면 안된다는 선언이 맞을까??

    ⁉️ Math는 SingleTon인가?

    ⁉️ Math는 static으로 클래스레벨이며 객체가 생성되지않는다 근데 그러면 어디에 저장되는거야...?

     

     

    Static변수에 관한 것 그리고 Private 과 SingleTonPattern

    - static은 instance가 아니라 클래스에 귀속되는것.

    메모리관점에서

    A라는 클래스가 로딩되는 순간

    JVM의 Method Area에 딱 1번 생성된다. 그래서 객체가 몇개든 이 메모리 주소를 쓴다는 것.

    전역변수처럼 동작한다는 것

    Class밖의 class에서 상속하여 쓸때에도 같은 메모리 주소를 공유한다.

     

    -그래서 static은 객체 없이 호출이 가능하다. static메서드란게 있는데, static 변수만 접근 가능하다.

     

     

    그래서 Math클래스같은 경우에도

    public final class Math{

        private Math(){ }

    }

    와 같은 형태로 되어있기에 ... Math라는 전역변수를 공유해서 쓴다고 생각하면된다.

    ㅇㅋ 그럼 public은 모두가 쓸수있는 메서드임을 선언한것이라치자.

    ⁉️그럼 final은?? 더이상 수정하면 안된다는 선언이 맞을까??

     대상에 따라 다르다

    final이 변수일 때, 값 변경 불가 / 메서드일 때 오버라이딩 불가 / 클래스일 때 상속 불가로 쓰는것...

    그럼 math클래스에서 붙은 final은 더이상 상속하지마! 변경하지마!하는것이겠죠

     

    그래서 더이상 수정하면 안된다 -> 는 절반만 맞는말이라는 것.

     

    그래서 마지막으로 private생성자까지 뜯어보면 객체 생성 자체를 금지하는 것이다.

    Math는 객체로 쓰라고 만든 클래스가 아니라, 클래스의 메서드를 쓰기 위해 통과하는 문이다?라고 보면 되는 것 !

     

    그래서 이걸 Utility Class 패턴이라고 한다.

     

    ㅇㅋ 그럼 Math는 SingleTon인가?

    아니다

    하 지금 싱글톤 하나 실제 예제로 써먹었다고 싱글톤에 매몰되어있다;;;

    근데 그럴만함ㅋ

    SingleTon정의가 객체를 딱 하나 생성해서 공유하는건데...

    Math는 객체 생성 자체를 하지 않는다는것.

    public class Singleton {
        private static Singleton instance = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return instance;
        }
    }

     

    public final class Math {
        private Math() {}
        public static int max(int a, int b) { ... }
    }

     

    이것이 싱글톤과 Math의 차이이다...

     

     

     

     

    여기서 생긴 궁금증

    ⁉️ 그러면 Math는 static으로 클래스레벨이며 객체가 생성되지않는다 근데 그러면 어디에 저장되는거야...?

    맞는데 정확한 표현을 바꾸는게 맞다고 한다. 

    Math는 인스턴스를 생성하지 않고 공용(static)메서드 집합을 제공하기 위한 유틸리티 클래스이다.

    즉 통과하는 문이란 말을 기술적으로 바꾸면 "네임스페이스"에 가깝다고 하는것이 맞다.

     

    - 오케이. 그럼 객체x 상속수 생성자 호출 x static멤버만 사용하도록 강제한다는 이해했어 그럼 어디다 저장되는가?

    JVM의 Method Area에 저장된다.

    Stack에는 메서드호출, 지역변수 / Heap에는 객체 / Method Area에는 static변수, 클래스정보가 저장된다

     

    Math는 인스턴스를 생성하지 않는 유틸리티 클래스이며,
    클래스 로딩 시 JVM의 Method Area(Metaspace)에 로딩되어
    static 메서드 형태로 사용된다.

     

    더 나아가 소멸시점까지 알아야 할 것 같아서 추가한다.

    static은 JVM이 종료될때, 즉 영원히 ...영원히,....

    Stack은 메서드 종료시

    Heap은 참조 끊기면 GC가된다.

     

     

     

    아니 이거 조각조각보면 배운내용인데 연결시키지못하는 내빡대가리가 너무 밉다 ....;;; 

    728x90

    댓글

Designed by Tistory.
티스토리 친구하기