public static void main(String[] args) {
int total;
System.out.println(total); // 컴파일 오류: variable total might not have been initialized
}클래스 필드는 기본값(0, null, false)이 자동으로 들어가지만, 메서드 안의 지역 변수는 그렇지 않습니다. 컴파일러가 "값이 정해지지 않은 변수를 읽으려 한다"고 막습니다. 실수로 쓰레기값을 읽는 C 언어의 사고를 원천 차단하려는 설계입니다.
✅ int total = 0; 처럼 선언과 동시에 초기화합니다.
int passed = 45, applicants = 60;
double rate = passed / applicants * 100; // 0.0passed / applicants가 정수 나눗셈이라 0이 되고, 그 다음 100을 곱해도 0입니다. double 변수에 넣는다고 계산이 double로 되지 않습니다. 계산은 피연산자 타입으로 결정됩니다.
✅ double rate = (double) passed / applicants * 100; → 75.0
long bigNumber = 3000000000; // 컴파일 오류: integer number too large리터럴 3000000000은 int로 해석되는데 int 범위를 넘습니다. 변수 타입이 long이어도 리터럴은 별개입니다.
✅ long bigNumber = 3_000_000_000L;
float ratio = 0.75; // 컴파일 오류: possible lossy conversion from double to float실수 리터럴 기본 타입은 double이므로 float에 넣으려면 narrowing이 됩니다.
✅ float ratio = 0.75f; — 또는 그냥 double을 씁니다. float를 써야 할 이유가 없다면 double이 답입니다.
String input = new String("admin");
if (input == "admin") { // false
System.out.println("관리자");
}==는 두 변수가 같은 객체(같은 주소)인지 봅니다. 내용이 같아도 다른 객체면 false입니다. 사용자 입력, DB 조회 결과 등 런타임에 만들어진 문자열은 리터럴과 다른 객체입니다.
✅ if ("admin".equals(input)) — 리터럴을 앞에 두면 input이 null이어도 NPE가 나지 않습니다.
double price = 0.1;
double sum = 0;
for (int i = 0; i < 10; i++) sum += price;
System.out.println(sum == 1.0); // false (0.9999999999999999)✅ BigDecimal을 문자열 생성자로 만들어 계산하거나, 원 단위 long으로 저장합니다.
char c = "A"; // 컴파일 오류: String을 char에
String s = 'A'; // 컴파일 오류: char를 String에작은따옴표는 한 글자 char, 큰따옴표는 String입니다. 길이 1인 문자열도 String입니다.
✅ char c = 'A'; String s = "A"; 변환이 필요하면 String.valueOf(c), s.charAt(0).