티스토리 뷰

Java 에 변수는 크게 클래스변수,인스턴스변수,지역변수로 분류할수있다.

 

- 클래스변수 와 인스턴스변수 모두 멤버 변수이다 멤버 변수랑 클래스 안에서 생성된 변수를 뜻한다.

 

- 지역변수 는 메소드 안에서 생성될떄 메모리가 할당되고 메소드가 종료되면 다시 메모리 해제 되어 사라진다.

 

위 3개의 변수 는 생성된 위치에 따라 구분이 나뉘는데, 클래스변수와 인스턴스 변수에 대해 좀더 알아보자

 

class Test{
  int  a  ;             //인스턴스 변수
  static int  b ;     //클래스 변수
  
}

public class Hello2 {

  public static void main(String[] args) {

 

 Test.a = 20;  // 인스턴스 변수는 객체생성(인스턴스화)될때 메모리에 할당이되기떄문에 인스턴스화 전엔 사용이불가!
    
 Test.b = 10 ; //클래스 변수는 전역변수 로써 객체 생성(인스턴스화)하지 않아도 접근하여 사용이가능하다!
  

  }

}

 

- 클래스변수는 클래스가 생성될때  Method Area 영역 에 저장된다.

 

- 인스턴스변수는 객체별 생성된 Heap Area 에 저장된다. 

 

-  b 변수(클래스변수) 는 method 영역에 저장되어 Test 클래스를 통해 만들어진 객체들은 공통된 값으로 공유한다.

 

-  a 변수(인스턴스변수) 는 각각의 Heap 영역에 저장되기때문에 각각의 값을 따로 갖을수있다.

(Test 클래스를 new 를통해서  객체로 만든후 a 에 접근하여야만 Heap 영역에 저장되면서 hashCode 가 참조변수

에 담기고 실제 참조값은 Heap영역에 저장된다. class Test 내부에서 메서드를 만들고 출력문에 a. 을 찍으면
아직 객체로 생성되지않았기 떄문에 a.hascod() 생기지 않는 걸 확인할수있다

Test t = new Test(); t 는 Test를 가리키는 hashCode가있다.)

 

( 직관직으로 보이기위해 test1.b 으로 접근하여 값을 변경했지만, Test.b 로 접근하여 값을 변경하는 것이 바람직하다)

JVM 구조와 메모리구조에 대해 더알아봐야겠다..