변수의 종류와 메모리 구조

HyeonWoo·2021년 1월 6일
0

Java

목록 보기
3/12
post-thumbnail
post-custom-banner

메소드 영역

  • 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역.

  • JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)을 읽어들여, 클래스에 대한 정보를 메소드 영역에 저장함.


힙영역

  • 모든 인스턴스 변수(멤버 변수)가 저장되는 영역

  • new 키워드를 사용해 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장함.

  • 힙 영역은 메모리의 낮은 주소 -> 높은 주소의 방향으로 할당됨.


스택 영역

  • 메소드가 호출될 때, 메소드의 스택 프레임이 저장되는 영역.

  • 메소드 호출 시, 메소드 호출과 관계되는 매개변수(파라미터 변수)와 지역 변수를 스택영역에 저장.

  • 스택 영역은 메소드의 호출과 함께 할당되며, 메소드의 호출이 완료되면 소멸.

  • 스택 영역에 저장되는 메소드의 호출 정보를 스택 프레임이라고 부름.

  • 후입 선출(LIFO)의 구조를 갖고 있으며, 메모리의 높은 주소에서 낮은 주소의 방향으로 할당 된다.


선언 위치에 따른 변수의 종류

public class Test{

    private int iv; // 인스턴스 변수.
    
    public static int cv; // 클래스 변수.
    
    public void print(){
    
    	int lv; // 지역 변수.
        
    }
    
 }
  • iv, cv는 클래스 내부에 선언되어 있으므로 멤버 변수.

  • cv는 static으로 선언되었으니 클래스 변수이고, iv는 인스턴스 변수

  • lv는 메소드 내에 선언되었으므로 지역 변수.

인스턴스 변수

  • 인스턴스가 생성될 때, 생성됨. 따라서 인스턴스 변수를 사용하기 전에 먼저 객체를 생성해야 함.

  • 인스턴스 변수는 독립적인 저장공간을 가지므로 인스턴스 별로 다른 값을 가질 수 있음.

  • 따라서 각 인스턴스마다 고유의 값을 가져야 할 때는 인스턴스 변수로 선언

  • 힙 영역에 올라감.

클래스 변수

  • static 키워드가 붙은 변수이다.

  • 클래스 변수는 해당 클래스의 모든 인스턴스가 공통된 값을 공유하게 됨.

  • 따라서 한 클래스의 모든 인스턴스가 공통적인 값을 가져야할 때, 클래스 변수로 선언함.

  • 클래스가 로딩될때, 생성되어(그러므로 메모리에 딱 한번만 올라감) 종료될 때까지 유지되는 클래스 변수는 public을 붙이면 같은 프로그램 내에서 어디서든 접근 가능한 전역 변수가 된다.

  • 인스턴스 생성 없이 접근할 수 있으므로 클래스이름.클래스변수(Test.cv)를 통해 접근할 수 있음.

  • 메소드 영역에 올라가며, 주로 공유의 목적으로 사용함.

지역 변수

  • 메소드 내에 선언되며 메소드 내에서만 사용할 수 있는 변수임.

  • 메소드가 실행될 때, 메모리를 할당받으며 메소드가 끝나면 소멸되어 사용할 수 없게 됨.

  • 스택 영역에 올라감.


참고자료

profile
학습 정리, 자기 개발을 위한 블로그
post-custom-banner

1개의 댓글

comment-user-thumbnail
2022년 12월 23일

안녕하세요 ㅎㅎ 우연히 글보다가 댓글 남겨요!
힙 영역에 '모든 인스턴스 변수' 다음에 괄호로 (멤버 변수)를 적어주셨는데요.
멤버 변수는 클래스 변수와 인스턴스 변수를 포함하고 있어서
'인스턴스 변수는 멤버 변수다' 라고 하면 정의가 맞는데
'인스턴스 변수는 멤버 변수다' 라고 하면 틀린 정의가 되지 않을까요??
위처럼 이해하신게 맞다면 다행인데
'인스턴스 변수 == 멤버 변수' 라고 생각하셨으면 도움이 되지 않을까 해서 댓글 남깁니다.

답글 달기