- 스택, 힙, equals(), ==2024년 07월 10일
- chantleman
- 작성자
- 2024.07.10.:15
기본데이터타입은 스택에 저장. (byte, short, int, long, float, double, char, boolean)
참조데이터타입은 힙에 저장. (String, 배열, 클래스, 인터페이스 등)
스택 (LIFO)
원시타입은 스택에 저장
객체타입의 주소값은 스택에 저장
변수 설정 ('변수=주소값'으로. 주소값에 대한 값은 힙에 있음)
String str = "100"; ← 100이라는 문자열은 힙에 저장되지만 str이라는 변수는 스택에 저장됨
String str = new String(~~); → 힙에 새로운 공간 생김
함수 호출시 생성되는 지역변수와 매개변수가 저장됨( 지역변수처럼 잠깐 있다 사라지는 변수는 스택에 저장 )
함수 호출이 완료되면 사라짐
힙 (FIFO)
객체 타입은 힙에 저장됨
실제 데이터(객체, 문자열)가 저장
100: skjdfhkasjdfls
new라는 키워드가 있으면 힙에 저장
필요에 의해 동적으로 메모리를 할당할 때 사용(new, 포인터)
데이터
전역변수, static, 상수
프로그램 시작과 동시에 할당. 프로그램 종료되면 메모리에서 소멸
힙 영역의 데이터들은 가비지컬렉터가 (지금 사용중인 변수들 말고) 오래된 데이터들을 버림
(그 기준은 모름. 개발자가 컨트롤 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
728x90'자바' 카테고리의 다른 글
거스름돈 계산하기 예제 (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 다음글이전글이전 글이 없습니다.댓글