오늘은 '변수'에 대해서 유형, 선언 위치, 사용 범위, 메모리, 생성과 소멸 관점에서 정리를 해 보겠다.
가장 일반적으로 볼 수 있는 변수이다. 함수 내부에 선언되어 그 함수 내부에서만 사용할 수 있고, 함수가 호출될때 생성, 함수가 끝나면 소멸한다. 스택 메모리를 이용한다.
스택 메모리는 함수가 호출 될때 사용하는 메모리로 알려져 있다. 그런 의미에서, 함수 안에서 선언되는 지역변수가 스택 메모리에 저장된다는 것은 당연하다고 할 수 있다. 함수 호출 후 수행이 끝나면 메모리는 자동으로 반환된다.
public static void main(String[] args) {
int num1 = 10
int num2 = 20
int sum = 0;
sum = add(num1,num2);
}
public void add(int n1, int n2) {
result = n1 + n2;
return result;
}
클래스내에 만들어지는 변수를 의미한다. 보통 private
로 생성하고, 클래스 내부에서만 사용하지만 public
등으로 만든다면 참조 변수로 다른 클래스에서도 사용 될 수 있다.(하지만 외부에서 멤버변수의 직접 접근은 지양한다.)
인스턴스가 생성될 때 힙(Heap) 메모리에 저장되며, 가비지 컬렉터(GC)에 의해 소멸된다.
인스턴스는 클래스로부터 생성된 객체를 의미한다.
클래스를 기반으로 new
와 생성자를 이용하여 여러개의 인스턴스를 생성 할 수 있다. 지역변수로서 만들어진 참조변수가 스택에 저장되고, 참조 값(인스턴스의 힙 메모리 주소값)을 통해 힙 메모리에 저장된 인스턴스에 접근한다.
public void static main(String[] args) {
Student studentByeon = new Student();
//studentByeon은 main 함수내에서 쓰이는 멤버 변수이자 인스턴스를 가리키는 참조변수이다.
System.out.println(studentByeon); // 참조값 출력 [classfullname]@[참조값]
}
class Student {
private id;
private name;
//id와 name은 Student 클래스의 멤버 변수로서 인스턴스가 생성될 때 힙 메모리에 저장된다.
//생략//
}
static
예약어를 사용하여 클래스 내부에 선언 된다. 사용 목적에 따라 private
나 final
등의 예약어를 같이 쓰기도 한다. 프로그램이 처음 시작될 때 상수와 함께 데이터 영역 메모리에서 생성되고 프로그램이 끝날 때 소멸된다.
여러 인스턴스가 하나의 값을 공유할 필요가 있을 때 사용되는 변수이다(학번). 인스턴스가 생성되지 않아도 사용할 수 있어서 클래스 이름으로 참조한다. 같은 이유로 static 메서드에서는 인스턴스 변수를 사용할 수 없다.
정리