1. 필드와 지역 변수의 구분
- 필드(filed)
- 클래스에 포함된 변수
- 객체의 속성값 지정
- 힙 메모리의 객체 내부 생성
- 힙 메모리의 객체 안에 저장되는 필드는 객체가 사라지지 않는 한 절대로 삭제되지 않음
- 지역 변수
- 메서드에 포함된 변수
- 스택 메모리에 생성
- 자신이 선언된 메서드의 중괄호가 닫혀 메서드가 종료되면, 그 메서드 안에 선언된 모든 지역 변수가 메모리에서 통째로 삭제
class A {
int m =3; //상위 중괄호가 클래스일때는 필드
int n = 4;
void work1(){
int k=5; //상위 중괄호가 메서드일 때는 지역변수
System.out.println(k);
work2(3);
}
void work2(int i) { //상위 중괄호가 메서드일 때는 지역변수
int j =4;
System.out.println(i+j);
}
}
- 클래스 A에는 필드 m,n과 메서드 work1(), work2() 존재
- work1()메서드 안에서는 지역변수 k를 선언해 사용
- work2()메서드 에서는 지역 변수 i와 j를 선언해 사용
A a = new A();
System.out.println(a.m); //3
System.out.println(a.n); //4
a.work1(); //5->7
- 힙 메모리에 클래스 A의 객체 생성
- 객체 안에는 필드 m,n과 메서드 work1(), work2() 가 저장
- 참조 변수 a에는 객체의 위칫값 저장
- work1()메서드가 호출되면 work1() 메서드 안에 정의된 지역변수 k가 스택 메모리에 저장(int k =5) ,
- work1() 메서드 안에서 work2()메서드가 호출되면 work2() 메서드 안에 정의된 지역변수 i,j가 스택 메모리에 저장(int i =3, int j =4)
-프레임(frame) : 정의된 메서드의 중괄호에 해당하는 범위
- 해당 메서드의 실행이 종료되면 자바 가상 머신은 해당 메서드의 프레임을 통째로 삭제
- work2()가 완료되면 work2()프레임이 모두 삭제되며, work1()메서드도 완료되면 work1() 프레임도 삭제
package createobject;
//클래스 생성
class A {
int m = 3; //필드
int n = 4; //필드
void work1() {
int k=5; //지역 변수
System.out.println(k);
work2(3); //work2()안에 정의된 지역 변수를 스택 메모리에 추가
}
void work2(int i) { //인수를 변수 i에 대입해 입력매개변수로 활용
int j =4;
System.out.println(i+j);
}
}
public class create0bject_2 {
public static void main(String[] args) {
//클래스로 객체 생성
A a = new A();
//필드 값 출력
System.out.println(a.m);
System.out.println(a.n);
//메서드 호출
a.work1(); //work1()안에 정의된 지역변수를 스택 메모리에 추가
}
}
2. 필드와 지역 변수의 초깃값
- 필드
- 직접 초기화 하지 않아도 강제로 초기화
- 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 힙 메모리에 위치하는 필드는 강제로 초기화
- 지역 변수
- 직접 초기화 하지 않으면 저장 공간이 빈 공간 그대로 있어 값을 출력하고자 할때 오류 발생
- 스택 메모리는 강제로 초기화되지 않음
package createobject;
//클래스 정의
class A {
boolean m1;
int m2;
double m3;
String m4;
void printFieldValue() {
System.out.println(m1);
System.out.println(m2);
System.out.println(m3);
System.out.println(m4);
}
void printLocalVariable() {
int k;
//System.out.println(k); 지역 변수를 초기화 하지 않아 오류 발생
}
}
public class createobject_3 {
public static void main(String[] args) {
//클래스를 활용해 객체 생성
A a = new A();
//객체 활용
a.printFieldValue();
}
}
'Java > 문법' 카테고리의 다른 글
8-1장 패키지와 임포트 (0) | 2023.04.24 |
---|---|
7-4장 this 키워드와 this() 메서드 (0) | 2023.04.24 |
7-3장 생성자 (0) | 2023.04.24 |
7-2장 메서드 (0) | 2023.04.24 |
6-2장 객체의 생성과 활용 (0) | 2023.04.24 |