[CODE-STATES-BE] SEC-1[JAVA] 객체 메모리 할당 - 자료형 , Stack, Heap, GC

유형찬·2022년 9월 2일
0

Code States

목록 보기
3/21

Primitive Type과 Reference Type

자바에서 자료형은 크게 두 가지로 나뉜다.

Primitive Type과 Reference Type으로 나뉘는데 주 이야기가 아니니 간단하게 알아보자.

기본형

  • int , char , double , boolean 등 직접 메모리에 값을 저장하여 Stack에 값이 저장된다.
  • 지역변수로 보통 선언 하여 사용 되는데
    • 해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제 된다.

참조형

  • Wrapper Class : Integer , Character
  • Interface , Class , Enum , String
  • 위와 같은 Object 객체를 상속 받을 경우 참조 형 변수라고 한다.
  • 기본형과 다르게 Object object = new Object(); 의 경우
    • object 내부에 저장된 값은 주소이다. → 실제 값이 저장된 곳
    • object의 주소 값을 가진 놈은 스택에 저장되며 실제 object 는 Heap 영역에 저장된다.
  • 자바는 객체 지향 프로그래밍! 일반 자료형을 제외하고 참조형 변수라고 생각하자.

Stack과 Heap

1. Stack 과 Heap 의 차이

1) Stack

Stack 은 후입선출(LIFO) 의 특성을 가지며 스코프(Scope) 의 범위를 벗어나면 스택 메모리에서 사라진다.

중괄호(brace) 시작과 끝, 즉 중괄호 내부가 범위가 된다. 예를 들면 while,if, for 의 중괄호

중괄호 안의 값은 그 범위를 벗어나면 스택에서 사라지게 된다. (닫는 중괄호가 실행 되는 순간, 현재 할당된 스택 메모리는 사라지게 된다.

2. Heap

  • 자동으로 관리되지 않은 메모리 영역 (CPU 가 엄격하게 관리하지 않는다)
  • GC가 관리 해준다.

Heap은 instance 객체가 제거되기 전까지 스코프와 상관없이 값이 유지된다. stack 메모리에 있는 값은 스코프를 벗어나면 값이 상실되지만 c/c++ 에서 힙에 생성된 값은 생성하면 개발자가 직접 제거 해야 한다.

  • 자바는 가비지 콜렉터가 자동으로 치워준다.

3. stack 메모리 할당 과정 살펴보기

public class Stack {
	public static void main(String[] args) {
    	int num1 = 20;
        int num2 = 30;
        int sum = 0;

        sum = addNum(num1, num2)
        System.out.pringln(sum);
    }

    public static int addNum(int n1, int n2) {
    	int result = n1 + n2;
        return result;
    }
}

<그림 상세설명>

stack1(1) 

  • 메인 함수가 호출 되면 num1, num2,, sum 이라는 변수의 이름으로 stack에 메모리가 할당된다.
  • 또한 변수의 타입이 원시타입이기 때문에 실제값도 같이 할당

stack(2) 

  • addNum 함수가 호출이 되면 인자로 num1 과 num2 의 변수를 넘겨준다.
  • 또한 스코프가 addNum 함수를 이용한다. 스코프가 변경되면 기존의 sum, num2, num1 은 사용할 수 없게 된다.
  • n1, n2, result 의 데이터 타입으로 스택 영역 공간에 할당이 된다.

stack(3) 

  • addNum의 함수 호출이 종료가 되면 함수 호출 시에 사용되었던 모든 지역 변수는 스택 영역에서 사라지게 된다.
  • 함수 호출이 사라지기 전에 재 할당이 되어 sum 은 50으로 변환된다.

stack(4) - main 함수까지 종료가 되면 stack 에 있던 모든 데이터들이 사라지면서 프로그램이 종료된다.

4. Heap 메모리 할당 과정 살펴보기

public class Stack {

    public static void main(String[] args) {
    	int age = 19;
        String name = "Sejin Hong"
    }
}

  1. Garbage Collection
public class Stack {
	public static void main(String [] args) {
    	String url = "https://";
        url += "sejin.com";
    }
}

다음 구문을 실행해 보면 문자열이 합쳐지는 과정에서 기존에 있던 url에 합쳐지는 것이 아니라 새로운 Object 를 생성하게 되고 새로운 Heap 영역을 할당하게 된다. (참조 하고 있는 값이 없기 때문에 unreachable Object 가 된다.)

  • unrachable Object : Stack 에 도달할 수 없는 Heap 영역
  • JVM 의 가비지 컬렉터는 unreachable Object를 힙 영역에서 제거한다.
profile
rocoli에요

0개의 댓글