반응형
메모리 할당
정적 할당
- 메모리를 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.var = 1 / t2.var = 2
- 클래스에 고정된 정적 변수는 각각의 인스턴스들의 값이 변경되면 모든 값이 변경 됨
- t1.stVar = 1 / t2.stVar = 2
>>> t1.stVar = 2 , t2.stVar = 2
- t1.stVar = 1 / 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
반응형