자바

스택, 힙, equals(), ==

chantleman 2024. 7. 10. 10:15

 

스택

변수 설정 ('변수=주소값'으로. 주소값에 대한 값은 힙에 있음)

String str = 100;

String str = new String(~~); → 힙에 새로운 공간 생김

 

 

주소값 저장

100: skjdfhkasjdfls

new라는 키워드가 있으면 힙에 저장

 

기본데이터타입은 스택에 저장. (byte, short, int, long, float, double, char, boolean)

참조데이터타입은 힙에 저장. (String, 배열, 클래스, 인터페이스 등)

 

 

힙 영역의 데이터들은 가비지컬렉터가 (지금 사용중인 변수들 말고) 오래된 데이터들을 버림

(그 기준은 모름. 개발자가 컨트롤 x)

 

 

 

값을 비교할 때는 .equals() 사용

주소값을 비교할 때는 == 사용

 

int[] arr = new int[5]; //new라는 걸 쓰면 힙에 공간 5개 생김

이렇게 되면 힙에 5개의 공간이 생깁니다.

 

int a = 10;  //스택에 저장	
if(a==10)
{
	int b=15; //스택에 저장
	String str="abc"; // 힙영역에 abc만들어지고, 그것의 주소값이 스택에 저장
			
	String str2= new String("abc"); //힙에 abc가 새로 생기고, 스택에 주소값 저장
	if(str==str2)
	{
		int c=20;	//if문이 거짓이기때문에 스택에 저장x
		String str3="def"; // if문 거짓이라서 힙, 스택 저장 x
	}
	else
	{
		String test="test"; //힙에 test가 만들어지고, 그 주소값이 스택에 저장
	} // 변수 사라짐. 스택에서 test 사라짐. but 힙에서는 사라지지 않을 수 있음(가비지컬렉터가 설정)
			
	String str4="def";  // 힙에 def 만들어지고, 그 주소값이 스택에 저장
	int d=30; // 스택에 저장
} // a를 제외한 여태까지 모든 변수 값들이 스택에서 다 사라짐
int e=50; // 스택에 저장
String test1="test"; //힙에 저장돼있던 test의 주소값을 스택에 저장
int a=10; // 스택에 int a=10 저장
if(a==10)
{
	int sum=0; // 스택에 int sum=0 저장
	for(int i=1;i<=2;i++) // 1. 스택에 int i=1 저장. 3. 스택 i=2로 업데이트
	{ 	
		sum+=i; // 2. 스택 sum=1로 업데이트. 4. 스택 sum =3으로 업데이트
	} // 스택에서 i 사라짐
	int b=20; //스택에 저장
	String str= "abc"; //힙에 abc 만들어지고, 스택에 주소값 저장
} // 스택에서 sum 사라짐
int sum=0; //스택 sum 생성
for(int i=2;i<4;i++) // 1. 스택에 int=2 저장. 3. int=3으로 업데이트
{
	sum+=i; //2. 스택에서 sum =2로 업데이트. 4. sum=5업데이트
} // 스택에서 i 사라짐
String str2=new String ("abc"); // 힙에 abc 새로 만들어지고, 스택에 주소값 저장
String str3= "def"; // 힙에 def 만들어지고, 스택에 주소값 저장

 

 

 


String str1 = "";
String str2 = null; //주소값 없음(힙영역과 연결되지 않은 상태: null)
        
//정상적으로 출력됨
if(str1.equals("") || str1==null)
{
	System.out.println("값이 없다.");
}

 

 

String str1 = "";
String str2 = null; //주소값 없음(힙영역과 연결되지 않은 상태: null)
        
// 에러남.str2는 애초에 힙과 연결돼있지 않기 때문에 equals를 사용할 수 없음
if(str2.equals("") || str2==null)
{
	System.out.println("값이 없다.");
}

str2는 null이라 힙영역에 저장돼있지 않기 때문에 메소드를 사용할 수 없습니다.

따라서 이 코드는 실행시키면 에러가 납니다.

 

String str1 = "";
String str2 = null; //주소값 없음(힙영역과 연결되지 않은 상태: null)

//에러 안남. 첫번째 조건이 참이면 결과가 참이기 때문에 두번째 조건은 확인 안함
if(str2==null || str2.equals(""))
{
	System.out.println("값이 없다.");
}

이건 or 이기때문에 첫번째 조건만 참이어도 참을 출력시킵니다.

따라서 얘도 정상출력됩니다.

 

if문에서 조건을 여러개 줄 때 

조건 순서를 잘 줘야합니다.

 

 


https://dreamcoding.tistory.com/124

 

힙 메모리 관점에서 바라본 static 필드 사용의 장단점

static 변수와 인스턴스 변수 중 어떤 방식이 적합한지 선택하는 것은 메모리 최적화에 중요한 요소입니다. 이번 글에서는 힙 메모리 관리를 중심으로, static 변수를 사용하는 것이 언제 유리한지,

dreamcoding.tistory.com

 

 

'자바' 카테고리의 다른 글

거스름돈 계산하기 예제  (0) 2024.07.10
배열  (0) 2024.07.10
for문 break, continue  (0) 2024.07.09
이중 for문 예제  (0) 2024.07.08
시와 분을 입력받고 30분 뒤, 30분 전 시간 출력하는 예제  (0) 2024.07.05