JAVA/Bootcamp 자바

JVM의 메모리영역, 객체 생성과 static

whyHbr 2024. 2. 26. 12:42
728x90
반응형

JVM의 메모리 영역은 네개로 나뉜다.

 

메서드: static zone, none static zone 으로 나뉜다. 프로그램 종료 시 자동 소멸된다

Heap: 객체가 생성된다. ex) array, class..

사용이 끝나면 소멸 되어야 함. garbage collector가 주기적으로 해줌. 

포인터가 없어지면 쓰레기값이 된다. 포인터는 스택에 있고 스택은 프로그램 종료 시 소멸된다.

genetration 카운트가 높은 것부터 없앤다. 높은게 gc가 수집활 확률이 높다. -왜? 숫자가 낮은 것은 방법 사용됐다는 것. 오래 사용하지 않은 것부터 없앤다.

Stack: 프로그램 종료 시 소멸된다. 메소드가 호출되면 스택에 들어간다. thread가 만들어져 동작시킨다.

Literal: 문자열, 상수가 저장되는 공간이다.

 

모든 메서드가 static이라면?

Allstatic.hap(10,20); // 이 방식을 쓰는게 바람직하다.

 

상단 같은 방식 (객체생성)을 막으려면 생성자 메소드 호출을 불가능 하게 해야하는데,

어떻게? 접근 제어를 private으로 바꾼다. 호출하지 못하므로 객체 생성이 불가하다.

근데 이것을 사용할 수 있는 방법 : 모든 메서드를 static으로 설정. 스태틱은 객체 생성과 관련 없다. 클래스 이름으로 하기 때문에

클래스 이름 앞 생성자를 private 설정시 갹채 생성을 막을 수 있다.

 

생성자는 반드시 public이다? -> No. 틀린 말이다.

 

객체 생성을 막기 위해 private 설정. private이니까 이 클래스를 사용 못하는게 아니라 -> 다 static으로 설정해 클래스 이름으로 사용한다. allStatic.hap(19,10);

private생성자가 가지고 있는 클래스들의 멤버들은 모두 static이어야 한다.

 

Allstatic( 이것은 utility 클래스이다)

public static int hap(int a, int b){
   
int v = a+b;
    return 
v;
}

hap은 static 클래스이므로

 

AllstaticTest

System.out.println(AllStatic.hap(10,30));
System.out.println(AllStatic.min(30,59));

이렇게 사용한다. 클래스 이름. 메서

AllStatic st = new AllStatic();

sout(st.hap(20,10)); //이런 방식으로 사용할 수도 있지만 원래 의도에 어긋난다

 

AllStatic st =new AllStatic();

객체 생성을 하지 못하게 생성자 메서드를 private처리하자

 

AllStatic클래스에

private AllStatic(){}

추가하고 객체 생성을 하면 에러난다.

생성자를 private을 한다면 모든 멤버는 static을 가져야 한다

728x90