deblog

heap과 stack의 차이점은? 본문

IT/JAVA

heap과 stack의 차이점은?

스콘_ 2021. 4. 28. 23:23
반응형

일단 두 가지 모두 자바의 핵심 메모리 공간입니다.

 

프로그램이 운영체제로 할당받는 대표적인 메모리 공간은

 

1. 코드(code)영역

2. 데이터(data)영역

3. 스택(stack) 영역

4. 힙(heap)영역 이 있습니다. 이것을 설명하기 위해서는 타입설명이 필요합니다

 

 

기본형 타입은(Primitive type) 총 8가지 타입이 있습니다.

  • 정수형 
        1) byte(1)
        2) short(2)
        3) int(4) - default
        4) long(8)
  • 실수형
        1)float(4)
        2) double(8) - default
  • 논리형
        boolean(1) - true, false로 데이터 표현

기본형타입(Primitive type)이 아닌 모든 타입이 참조형 타입(Reference type)입니다.

참조형 타입은 빈 객체를 의미하는 Null이 존재하고, 

값이 저장되어 있는 곳이 주소값을 저장하는 공간으로 Heap메모리에 저장됩니다.

 

- Stack :  primitive 데이터 유형 즉 기본형 타입 객체의 heap영역 주소 할당

            기본데이터유형, 객체의 참조변수(heap영역의 주소값)

- heap : 생성된 객체를 할당, 실제 객체가 들어가는 메모리 영역

 

	//기본데이터할당
		int num01 = 25;
		System.out.println("데이터의 할당 확인(stack):"+num01);
        	//객체는
		//stack 영역에 직접적으로 객체를 할당하는 것이 아니라
		//heap 영역의 주소값으로 할당하고 있다. 
		//			a01_basic.Person@19e1023e
		//			패키지명.객체명@16진수의 주소값 
		Person p = new Person();
		System.out.println("데이터의 할당 확인(heap의 주소):"+p);
		//객체의 구성요소(필드, 생성자, 메서드)는 참조명을 통해서 접근이 가능하다.
		System.out.println("객체의 필드값 확인:"+p.num01);
		int num02 = 30;
		int num03 = 3;
		
		System.out.println(num02+"+"+num03+"="+(num02+num03));
		System.out.println(num02+"-"+num03+"="+(num02-num03));
		System.out.println(num02+"*"+num03+"="+(num02*num03));
		System.out.println(num02+"/"+num03+"="+(num02/num03));
		Product pd = new Product();
		System.out.println(pd);
		System.out.println("물건명"+pd.name);
		System.out.println("가격:"+pd.price);
		System.out.println("갯수:"+pd.cnt);

 

 String 값과 메모리할당
 1. boolean연산자 == 는 stack 영역의 데이터를 비교해준다
 2. 기본데이터 유형은 동일한 값을 할당하면 true로 처리되지만,
  객체의 경우 동일한 값을 할당하더라도 주소값이 다르기때문에 false가 처리되는 경우가
  많다. 

 

int num04 = 50;
int num05 = 50;
System.out.println("두개의 기본 유형 비교 : " + (num04==num05));
Product p02 = new Product();
Product p03 = new Product();
System.out.println(p02.name+ ":" +p03.name);
System.out.println(p02.price+ ":" +p03.price);
System.out.println(p02.cnt+ ":" +p03.cnt);
//두 객체의 참조값을 비교
System.out.println("참조값의 비교 " + (p02==p03));
//heap영역의 주소값이 다르기 때문에 stack영역의 주소값이 다르다
System.out.println(p02);
System.out.println(p03);

 

 3. String은 객체입니다.
 4. 데이터는 heap영역에 할당됩니다.

 5. 문자열을 동일한 문자열의 비교는 ==를 활용하면, 예외사항때문에 문제가 발생합니다
 6. 문자열의 동등 비교는 문자열이 객체이므로 사용되는 .equals() 메소드 사용합니다.

 

String name1 = "홍길동"; // "홍길동"으로 된 모든 문자열은 heap영역에 같은 주소를 쓴다.
String name2 = "홍길동"; // name1 = name2 는 true값이 나온다
String name3 = new String("홍길동");
String name4 = new String("홍길동");

 

new String()은 다른 heap영역에 주소값에 객체가 생성이 되기에 name3 == name4는 false값으로 처리됩니다.

문자열을 비교할 때는 문자열1.equals(문자열2)을 통해서 비교하여야만 합니다. 문자열이 같은것이지 두 객체가 같은 주소를 가지고 있지 않기 때문입니다.

 

name1.equals(name2), name1.equals(name3), name3.equals(name4)는 모두 문자열 자체에 대한 비교이므로 true로

처리됩니다.

 

 

'IT > JAVA' 카테고리의 다른 글

[Spring] AspectJ란?  (0) 2021.11.24
[JAVA] Collection (1)  (0) 2021.08.27
오버라이딩과 오버로딩의 차이  (2) 2021.04.28
AOP(Aspect Oriented Programming) 실습(3)  (0) 2021.04.17
AOP(Aspect Oriented Programming) 구현(2)  (0) 2021.04.17
Comments