스택
변수 설정 ('변수=주소값'으로. 주소값에 대한 값은 힙에 있음)
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
'자바' 카테고리의 다른 글
거스름돈 계산하기 예제 (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 |