Java - 메모리 할당(정적/동적), 정적 변수(=클래스 변수)와 인스턴스 변수

반응형

메모리 할당

정적 할당

  • 메모리를 stack에 저장
    • 지역변수와 매개변수가 저장되는 곳
  • 컴파일 단계에서 메모리를 할당 받는 것
  • 함수가 종료 될 때까지 할당받은 메모리 보유, 종료시 반환
  • 함수가 실행되는 동안 메모리 낭비 가능성 존재
// 메모리 정적 할당
int[] a = new int[5];
// (= arraylist를 사용해서 동적 할당 가능)

동적 할당

  • 메모리를 heap에 저장
  • 실행 단계에서 메모리를 할당 받는 것
  • 자바에서는 역할이 끝나면 가비지 컬렉터가 메모리의 할당 자원을 반환
    • 원래는 사용자에 의해 메모리 공간이 할당되고 해제
  • 배열 선언을 예로, 이후 new 연산자를 사용해 동적 할당
// 메모리 동적 할당
int [] a;

a = new int[5];

가비지 컬렉터 (Garbage Collector)

  • 자바에서는 가비지컬렉터 알고리즘을 통해 메모리를 관리 함
  • 가비지(쓰레기) : 사용이 끝난 객체
  • 가비지 콜렉션 : 메모리를 효율적으로 관리 할 수 있도록 가비지를 효과적으로 처리하는 작업

클래스 변수

정적 변수 static ( = 클래스 변수)

  • static 키워드를 사용하여 변수를 메모리에 정적으로 할당
  • 함수가 종료 될때 까지 할당받은 메모리를 보유 (메모리 낭비 가능성 존재)
  • 정적 할당 된 객체는 독립된 공간을 가지지 않고 클래스 자체에 고정
    • 즉, 값이 변경되면 정적 변수를 사용하는 모든 객체들의 값도 함께 변경

인스턴스 변수

  • 클래스 내에서 선언된 변수
  • 객체는 각각의 독립된 공간을 가짐
    • 즉, 값이 변경되면 다른 인스턴스의 값과는 독립적으로 변경

정적 변수와 인스턴스 변수의 이해 예시

  • 각각의 독립된 공간을 갖는 클래스 변수는 이름이 같아도 독립된 값을 가짐
    • t1.var = 1 / t2.var = 2
      >>> t1.var = 1, t2.var = 2
  • 클래스에 고정된 정적 변수는 각각의 인스턴스들의 값이 변경되면 모든 값이 변경 됨
    • t1.stVar = 1 / t2.stVar = 2
      >>> t1.stVar = 2 , t2.stVar = 2
public class staticTest {
	static int stVar; // 정적 변수
	int var; // 클래스 변수
	
	public static void main(String[] args) {
		
		staticTest t1 = new staticTest();
		t1.var = 1;
		t1.stVar = 1;
		
		staticTest t2 = new staticTest();
		t2.var = 2;
		t2.stVar = 2; 
		
		System.out.print("var : " + t1.var + ", stVar : " + t1.stVar + "\n");
		System.out.print("var : " + t2.var + ", stVar : " + t2.stVar + "\n");
	}
}
>>> var : 1, stVar : 2
>>> var : 2, stVar : 2
반응형