필드와 지역 변수의 구분
필드는 '클래스에 포함된 변수'로 객체의 속성값을 지정할 수 있다. 필드는 지역 변수와 구분해야 하는데 지역 변수는 '메서드에 포함된 변수'를 말한다. 클래스의 중괄호 안에 선언되면 필드이고, 메서드의 중괄호 안에 선언되면 지역 변수이다. 이 둘의 가장 큰 차이점은 생성되는 메모리 위치다. 필드는 힙 메모리 내부, 지역 변수는 스택 메모리에 생성된다. 스택 메모리에 저장되는 변수는 메서드의 닫힌 중괄호를 만나 메서드가 종료되면 자바 가상 머신이 자동으로 삭제하지만, 힙 메모리는 객체 안에 저장되는 필드는 객체가 사라지지 않는 한 절대로 삭제되지 않는다.
위 예제를 보면 클래스 A에는 필드 m, n과 메서드 work1(), work2()가 있다. 참고로 메서드는 '리턴타입 메서드명(){...}'의 형태를 가진다. work1() 메서드 안에서는 지역 변수 k를 선언하고, work2() 메서드 안에서는 지역 변수 i와 j를 선언했다. 매개 변수로 선언한 i도 work2() 메서드 안에 있는 지역 변수인 것이다. 그 다음에 클래스 A의 객체를 생성하면 참조 변수 a에 위치가 저장된다. 그리고 참조 변수와 포인트 연산자(.)를 이용해 필드 m과 n의 값을 출력했다. 마지막으로 work1() 메서드를 호출했다. work1() 메서드가 실행되고 안에 있는 work2() 메서드에 3이라는 값을 넘겨주면서(이 값은 i가 받는다) 호출한다.
메모리에 저장되는 구조를 보면 먼저 객체를 생성했으므로 힙 메모리에는 클래스 A의 객체가 생성된다. 객체 안에 클래스의 멤버인 필드 m, n과 메서드 work1(), work2()가 저장돼 있고, 각 필드값으로는 3과 4가 저장돼 있다. 스택 메모리에는 참조 변수 a에 객체의 위칫값이 저장돼 있다. work1() 메서드가 호출되면 work1() 메서드 안에 정의된 지역 변수 k가 스택 메모리에 저장되고, work1() 메서드 안에서 work2() 메서드가 호출되면 work2() 메서드에 정의된 지역 변수 i, j가 스택 메모리에 저장된다. 정의된 메서드의 중괄호에 해당하는 범위를 메모리에서는 '프레임frame'이라 부르는데, 해당 메서드의 실행이 종료되면 자바 가상 머신은 해당 메서드의 프레임을 통째로 삭제한다.
실행하게 되면 자바는 메인 메서드부터 실행하므로 3, 4, 5, 7 순으로 값이 출력된다.
필드와 지역 변수의 초깃값
필드(힙 메모리)는 직접 초기화하지 않아도 강제로 초기화된다. 반면 지역 변수(스택 메모리)는 직접 초기화하지 않으면 저장 공간이 빈 공간 그대로 있어 값을 출력하고자 할 때 오류가 발생한다. 이는 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 강제로 초기화되고, 스택 메모리는 강제로 초기화되지 않기 때문에 발생하는 차이다.
'development > Java' 카테고리의 다른 글
JAVA 공부 해볼까 (13) (2) | 2021.12.25 |
---|---|
JAVA 공부 해볼까 (12) (0) | 2021.12.24 |
JAVA 공부 해볼까 (10) (6) | 2021.12.18 |
JAVA 공부 해볼까 (9) (0) | 2021.12.16 |
JAVA 공부 해볼까 (8) (4) | 2021.12.14 |