일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 오프라인 소모임
- 시나공
- js
- 식물
- 어피티 독자
- 정처기
- 식물키우기
- 스프링
- AOP
- 개발 공부
- springAOP
- Spring
- 달개비
- 어피티 7월 북클럽
- 정보처리기사 실기
- 수경재배
- 싱고니움
- 아보카도키우기
- 정처기 공부
- 정보처리기사 공부
- 스프링AOP
- 삼색달개비
- 정보처리기사 합격
- 자바
- 북클럼
- 정처기 실기
- 아보카도 키우기
- 정보처리기사
- 식물 키우기
- 아보카도
- Today
- Total
deblog
heap과 stack의 차이점은? 본문
일단 두 가지 모두 자바의 핵심 메모리 공간입니다.
프로그램이 운영체제로 할당받는 대표적인 메모리 공간은
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 |