JAVA_Static

승주😊·2021년 4월 2일
0

JAVA

목록 보기
7/7
post-thumbnail

Static (정적 변수)

  • static이 붙은 멤버 변수는 객체의 개수에 상관없이 단 하나만 생성된다. (클래스 변수)
  • 모든 객체가 공유하기 때문에 메모리를 효율적으로 사용할 수 있다.
  • 보통 변수나 메소드 앞에 static 키워드를 붙여서 사용한다.
  • static 변수는 static 메모리 영역에 존재하므로 객체가 생성되기 이전에 이미 할당되어 있다. ( 즉, 객체 생성과 관계없이 접근 가능)

자바 메모리 구조

자바 메모리 구조설명
Static Area- 필드 부분에서 선언된 변수 (전역 변수)와 정적 멤버 변수 (Static),생성자, 메소드가 저장되는 영역
- 프로그램이 종료될 때까지 어디서든 사용 가능
Stack Area- 파라미터와 지역변수의 데이터를 저장하는 영역
- 함수 종료 시 소멸된다.
Heap Area- 참조형의 데이터 타입을 갖는 객체(인스턴스), 배열 등의 데이터가 저장되는 영역
- Stack 영역의 공간에서 실제 데이터가 저장된 Heap영역 참조값을 new연산자를 통해 리턴 받는다.
- 실제 데이터를 가지고 있는 Heap 영역의 참조값을 Stack영역의 객체가 갖고 있다.

참조 그림_stack & heap

JVM(JAVA Virtual Machine) & 메모리 구조

  • JVM은 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있도록 해준다.
  • 운영체제 위에서 동작하는 프로세스로 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있도록 바꿔 실행시켜 준다.
  • JVM의 구조는 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area 총 4가지로 구성되어 있고 앞서 설명한 메모리 구조는 Runtime Data Area를 보면 된다.

jvm

Static 사용 예시

에제1)

  public class Article{
  
     // 전체 게시물(객체)의 수를 나타내기 위해
    private static int count = 0;
   
    private int num;
    
    private String title;
   
    
    public Article(int num, string title){
        this.num = num;
        this.title= title;   
        count++; //Article 생성시 count 수 증가
    }
    
    public void setCount(int count){
        this.count = count;  
    }
  
  }
public class Main1{
   
   public static void main(String[] args) {
 
	 Article.setCount(0);
     
     Article as1 = new Article(1,"첫 번째 글 제목");
     Article as2 = new Article(2,"두 번째 글 제목");
     Article as3 = new Article(3,"세 번째 글 제목");
     
     System.out.println(as1.count);  //결과값이 3
     System.out.println(as2.count);  // 결과값이 3
     System.out.println(as3.count);  // 결과값이 3
     System.out.println(Article.count); //결과값이 3 -> static 변수는 모두 공유
     
    }
}

예제2)

public class Test {
    private String name = "홍길동";
    private static String author = "글쓴이";
 
    public static void printMax(int x, int y) {
        System.out.println(Math.max(x, y));
    }
         
    public static void printName(){
       // System.out.println(name); 에러(불가)
       System.out.println(author);
    }
}
  • static 메소드는 객체의 생성없이 접근 가능한 함수이므로, static 메소드에서 접근하는 변수는 모두 static 변수 여야 한다!

static 변수의 활용

  • 인스턴스 간에 데이터 공유가 필요한 상황
  • 모든 인스턴스에서 같은 값을 가져야 하는 경우
profile
All the Best❤

0개의 댓글