퀴즈 피드백
전반적으로 디테일이 부족한 느낌 (print와 println 구분 필요!!)
int plused = 0;
int n = 0;
// 1부터 n까지의 합을 구할 때, 합이 50을 넘는 조건을 만족하는 n의 최솟값
// 1, 2, 3, 4, 5, ... 9, 10
1. while (true) { // n = 9까지 진행되었을 때의 합 = 45
// n = 10 차례
if(plused > 50) break; // 합이 50이 넘지 않아서 그대로 진행
plused += n; // 45 + 10
n++; // n = 11
} // n이 11이 되고 plused가 50을 넘어서 while문이 종료됨
// 실제 최솟값인 10과 11 사이의 차이 발생!
2. while (true) { / n = 9까지 진행되었을 때의 합 = 45
// n = 10 차례
plused += n; // 45 + 10
if(plused > 100) break; // 합이 55가 되어서 while문이 종료되고 n값은 10이 출력됨
n++;
}
데이터 타입 : 기본 타입(primitive type) & 참조 타입(reference type)
기본 타입이 값 자체를 저장하는 것이라면, 참조 타입은 값이 있는 주소를 저장하는 것이다.
ex. 노트북 두려고 한다면 노트북이 책상에 있는 것 vs 노트북을 찾으려면 5층으로 가세요
변수는 스택의 영역에 형성되고, 객체는 힙 영역에 형성된다.
힙 영역에서 생성된 객체나 배열을 참조하는 변수나 필드가 없어지면, 가비지 콜렉터에 의해 자동으로 삭제 된다.
참조 변수의 ==, != 연산은 참조 변수가 가지고 있는 주소가 같은지 아닌지를 비교하는 것이다. == 연산을 했을 때 동일한 객체를 참조하고 있으면 true, 아니면 false 값이 나온다.
문자열만을 비교하고 싶으면 equals 메소드를 사용한다.
자바에서는 문자열 리터럴이 동일하다면 같은 String 객체를 공유하도록 되어 있다.
ex.
String str1 = "안녕하세요?";
String str2 = "안녕하세요?";
System.out.println(str1 == str2); // 리터럴 동일, 주소값이 같다 => true
System.out.println(str1.equals(str2)); // str1과 str2의 문자열 자체만 비교
// 결과 : true
String str3 = new String("반갑습니다!");
String str4 = new String("반갑습니다!");
System.out.println(str3 == str4); // 둘다 new 연산자로 생성했기 때문에 서로 다른 객체를 참조한다, 주소값이 다르다 // 결과 : false
System.out.println(str3.equals(str4)); // str3과 str4의 문자열 자체만 비교
// 결과 : true
참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있다. null값으로 초기화된 참조 변수는 스택 영역에 생성된다.
null값을 가지고 있는 참조 타입 변수를 사용하면 NullPointerException 에러가 발생한다.
String str6 = "자바";
String str7 = null;
System.out.println(str7.length()); // 오류 발생
// str7이 참조하는 객체가 없기 때문에 객체 메소드인 length를 사용할 수가 없다.
str6 = null; // str6은 더이상 객체를 참조하지 않게 된다.
// JVM은 필요 없어진 객체를 가비지 콜렉터를 통해 메모리에서 자동 제거 한다.