메모리 영역으로 들어가기 전, 변수의 종류를 알아야 한다.
[출처] : https://coding-factory.tistory.com/830
지역변수는 메소드나 함수 내부에서 선언된 변수를 일컫는다.
class Main {
public static void main(String[] args) {
int a = 10;
}
}
main
이라는 함수(메서드)가 실행됐고, 실행 후에 int a=10
가 실행됐다.
함수가 실행됨으로써, stack
메모리영역에 저장되고, 이는 함수가 끝나기 전까지 살아있다.
즉, 지역변수 생명주기는 함수 실행과 동시에 생성되고, 종료와 동시에 소멸한다.
main
이라는 함수가 실행됐으니 int a
가 10이라는 값을 가지고 스택에 저장되고, 바로 함수가 종료되면서 소멸한다.
인스턴스 변수 는 말 그대로 인스턴스가 생성될 때 만들어지는 변수. 인스턴스란 객체라고도 불리고 폴더라고도 불린다. 즉, 객체 변수라는 말이 인스턴스 변수와 같다고 할 수도 있다.
{
int iv;
void method() {
int lv = 0;
}
}
이렇게 있다고 치자. 여기서 int lv
는 인스턴수 변수이다. 변수의 종류는 선언된 위치에 따라서 변수가 바뀌는데, 지역변수를 제외한 변수들 중 static
이 붙지 않은 것이 인스턴스 변수이다!
여기까지가 기본적으로 알려진 상식이다. 하지만 멋사 교육중엔 또 다른 이야기를 접했다.
인스턴스 변수는 객체 변수라고도 되기 때문에, 객체로써 활용도도 지닌다.
예를 들어보자.
public class Animal {
...
}
/* 객체와 인스턴스 */
public class Main {
public static void main(String[] args) {
Animal cat, dog; // --- 1) '객체'
// 인스턴스화
cat = new Animal(); // 2)cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
dog = new Animal(); // 3) dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
Animal
이라는 클래스에 cat
과 dog
이라는 객체를 선언했다. (실체화는 아직 안된상태) — 1)
cat
이라는 객체에 cat = new animal()
이라고 선언하고, 객체를 생성 및 실체화함. 이는 즉,
Animal
클래스에 인스턴스가 된다.
즉, 객체가 생성되면(클래스 일 때) 해당 클래스의 인스턴스 변수가 되는 것이고, 이 또한 함수 내에서 선언 및 생성한 것이기 때문에 변수 자체는
Stack
영역에 쌓이고, 리모컨을 쥔 상태로 실체는Heap
영역을 가리키고 있는 것이다!!