hyeongwoo's blog

[Java] None_Static영역과 Static영역 본문

JAVA

[Java] None_Static영역과 Static영역

toribro 2024. 2. 2. 17:51

Static

Static이라는 의미는 정적이라는 의미를 가지고 있다. 자바에서 Static영역의 메모리가 있는데 여기에 할당되는 변수나 메소드는 클래스당 딱 한번만 할당되며 모든 인스턴스가 공유를 한다.

 

Static영역과 None_Static영역

자바에서 클래스안에있는 None_static영역의 변수나 메소드들은 각각 인스턴스 변수, 인스턴스 메소드라고 한다.  인스턴스 변수와 메소드들은 인스턴스가 생성이 될때 마다 각각 다른 메모리에 할당되는데 해당 인스턴스 영역은 인스턴스를 참조하고있는 참조변수를 통해서만 접근 ,즉 객체를 통해서 만 접근이 가능하다. 

반면에 Static영역의 변수와 메소드는 객체생성없이 클래스로 바로 접근할 수 있다.(참조변수로도 접근이 가능하긴하다.)  이러한 Static변수와 메소드들을 클래스 변수 클래스 메소드라고 부른다. 클래스변수와 메소드들은 클래스당 하나의 메모리 영역만 존재하고 모든 객체가 공유한다. 

 

<메모리구조>

                                                                                              클래스 영역

클래스영역

 

인스턴스영역(None_Static)과 클래스영역(Static)의 특징

 

인스턴스영역(None_Static)

  1.  객체마다 각각 다른 영역이다.
  2. 객체를 통해서만 접근가능하다.
  3. 객체가 생성될때마다 메모리에 할당된다.
  4. 객체가 생성되고 객체가 가비지 컬렉터에의해 수거될때 소멸된다.
  5.  heap영역 메모리에 할당된다.

 

클래스영역(Static)

  1. 클래스당 하나의 영역만 존재한다.
  2. 클래스로 접근 가능하다.
  3. 컴파일시 메모리공간이 할당되고 프로그램이 종료될때까지 지속된다.
  4. 모든 객체가 메모리를 공유해서 사용한다.
  5. static영역 메모리에 할당된다.

 

Static 변수

  • 전역변수의 역할을 할수가 있다.
  • 변수 선언과 동시에 초기화 시키는 것을 권장한다.

 

Static 메소드

  • Static메소드내에서는 Static영역의 변수만 사용이 가능하다
  • Static메소드내에서는 Static메소드만 호출이 가능하다.
    • None_Static영역은 객체 생성시 메모리공간이 할당되는 영역이므로 컴파일 과정부터 생성되는 Static영역에서 사용시 메모리 생명 주기의 불일치로 사용이 불가하다. (Static영역이 메모리 할당 시점이 더 빠르기 때문,인스턴스 영역의 변수나 메소드는 생성이 안되었기 때문)
    • None_Static영역에서 Static영역의 메소드나 변수는 사용할 수 있다.(인스턴스 영역이 생성되는 시점에서는 이미 Static영역은 생성이 되었기때문)

 

예시 코드

class A{
    private int a=0;//비정적 필드
    private static int count=0;//정적 필드
    private static final double PI=3.141592; //상수로 사용 가능
	
    //객체생성시 비정적필드,정적필드 값 1씩 증가
    public A(){
    	a++;
    	count++;
    }
    
    public static int getCount(){
    	return count;
    }
    
    public void setA(int a){
    	this.a=a;
    }
    
    public int getA(){
    	return this.a;
    }
    
    public static double getPI() {
    	return PI;
    }
  
}



public class Main{

    public static void main(String[] args){ //자바 main함수도 static 함수이다.
    	A a1=new A();//인스턴스 생성
        System.out.println(a1.getA());//비정적 필드반환 a==1
        System.out.println(a1.getCount());// 정적 필드 반환 count==1
        
        A a2=new A();
        System.out.println(a2.getA());// 다시 0에서 a==1
        System.out.println(a2.getCount());// count==1에서 count==2
        
        A a3=new A();
        System.out.println(a3.getA());// 다시 0에서 a==1
        System.out.println(a3.getCount());// count==2에서 count==3
        
        
        System.out.println(A.getCount());//클래스로 바로 정적필드 접근
        System.out.println(A.getPI());//상수 접근
        //정적필드는 모든 인스턴스에서 메모리를 공유한다.
     }
 }

'JAVA' 카테고리의 다른 글

[Java] final  (0) 2024.02.10
[Java] IO_(입출력스트림)  (0) 2024.02.02
[Java] 다형성  (0) 2024.01.27
[Java] 상속  (0) 2024.01.26
[Java] 메소드  (0) 2024.01.26