Java 자바 메모리 구조

자바 메모리 구조


Static , Heap, Stack 이란

출력(모니터), 연산(CPU), 저장(메모리)

메모리는 논리적으로 메모리가 떠 있는 시간에 따라 Static , Heap , Stack 으로 나눠 놨다.

static

프로그램의 시작~끝 담당 (계속 메모리에 떠 있기때문에 부화가 큼)

heap

동적할당 영역, 메모리에 떠 있다가 할 일이 다 끝나면 사라짐 (행위의 시작과동시에 실행)

stack

행위에 대한 정보들을 저장하는 영역 (잠깐 떳다 사라짐)




자료형 메모리 구조

RAM(메모리)에 8바이트 크기의 메모리가 있다고 하면 메모리는
1바이트마다 0부터 7까지의 메모리 공간을 만들고 각 공간마다 이름을 붙여준다.

그리고 4byte크기인 자료형int를 int num = 10; 라고선언을 하면 컴퓨터는 0~7까지의 공간중에 비어있는 곳에 변수"num"이란 이름으로 4byte 크기 만큼의 메모리를 사용해서

정수 '10' 이라는 데이터를 메모리에 저장한다.

그리고 num을 호출하면 그 값으로 10이라는 정수가 출력된다.



일반변수와 레퍼런스(참조)변수

일반변수

일반변수1

일반변수는 int,double,...등 기본 자료형 타입의 변수들을 말한다.

기본자료형 타입은 크기가 int는 4Byte 의 크기륵 갖고있는것처럼 크기가 제각각 다 정해져 있다.

그리고 일반변수는 크기가 정해져 있기때문에 stack메모리공간에 데이터가 바로 할당된다.


레퍼런스(참조)변수

참조변수는 클래스타입의 변수로 크기가 정해저 있지 않다.

개발자가 어떤 타입을 몇개를 넣느냐에 따라 크기가 커지거나 작아지거할 수 있다.



그리고 참조변수는 일반변수와 달리 실행이 되었을때 크기를 알수있어 stack메모리공간에는 참조변수의 데이터를 저장할

heap의 주소를 갖고있다가 실행이되면 heap의 참조변수 데이터가 할댕되어서 stack이 갖고있는 heap의 조소와 연결된다.



참조변수 vs 일반변수

일반변수 : 크기가 정해저 있다.(컴파일 시점),

stack공간에 데이터가 저장됨


참조변수 : 크기가 정해저있지않다. (컴파일 시점)

new로 변수가 힙에 할당 될때 크기를 알 수 있다.(프로그램 실행 시).

stack동간에 참조변수의 데이터를 갖고있는 힙공간의 주소를 저장하고 실행시 stack의 힙데이터 주소를 힙에 담겨있는 참조변수의 데이터랑 연결된다.



메서드

메서드1

출처 데어프로그래밍 강좌

메서드란?

(다른강의에서는 메서드를 함수나 붕어빵기계로 비교하는데 이 강의는 행위 그자체에
비교를한다.)




위 그림처럼 손님이 커피마시는 행위 커피머신이 커피를 만드는 행위 자체
메서드라고 할 수 있다..

  public class Test {
    static String make(){
        String coffee = "커피를 만드는 중입니다.";
        return coffee;
    }
    public static void main(String[] args){
        System.out.print(Test.make());
    }
}

make()라는 메서드가 문자열 "커피를 만드는 중입니다."를 출력하는 행위를 했다.




메서드 stack 메모리

public class Test {
    static void a(){
        b();
        System.out.println("a1");
        System.out.println("a2");
        System.out.println("a3");

    }
    static void b(){
        System.out.println("b1");
        System.out.println("b2");
        System.out.println("b3");

    }
    public static void main(String[] args){
        System.out.println("m1");
        a();
        System.out.println("m2");
        System.out.println("m3");
    }
}

위 코드의 스택메모리 실행순서

main() -> a() -> b() 메서드순으로 실행되며

종료순서는 b() -> a() -> main() 순이다.



지역변수와 전역변수

전역변수 stack

  • 메서드 실행시 메모리 할당
  • 메서드가 종료될 때 메모리에서 사라진다.

    지역변수 heap, static

    • heap : new키워드로 객체를 생성후 메모리에할당
        더 이상 참조 하지않을 때 메모리에서 사라진다.
    • static : main메서드 실행시 메모리에 할당
          main메서드 종료시 메모리에서 사라진다.



메서드의 리턴

void 더하기(){
    int sum = 5+6;
}

위의 더하기 메서드에서 더하기메서드의 지역변수인 sum이 값을다른곳에서 찾고싶지만 더하기 메서드가 실행되고 종료되면 메모리에서지워지기때문에 다른 곳에서는 sum이라는 지역변수를 찾을 수 없는데

이때 return이라는 키워드를 사용해서 지역변수 sum을 사용할 수 있게 할 수 있다.

public class Test {
    static int add() {
           int sum = 5+6;
           return sum;
    }

    public static void main(String[] args) {
        int result = add();
        System.out.println(result);

    }
}



메서드의 매개변수와 인수

매개변수(parameter)

  • 메소드, 생성자를 선언할때, 데이터 값이 어떤 데이터 타입으로 들어올지 정해준다.

    인수(argument)

  • 매개변수에 값을 전달해주는 것을 말한다.
public class Test {

    static void add(int n1, int n2){
    System.out.println("더하기를 하셨습니다.");
    int sum = n1+n2;
    System.out.print(sum);
    }

  static void inputCard(String card){
        System.out.println(card + "카드를 투입하셨습니다.");

  }
    public static void main(String[] args) {

        inputCard("삼성");  
         add(500,500);

    }
}

위 코드에서는 inputCard(String card) inputCard메서드의 매개변수로는
String 타입의 변수 card 가 들어오며

아래 메인 메서드 에서 inputcard() 메서드에 인자값으로 String타입의 "삼성" 이란 문자열을 전달해 주었다.