자바에서 변수는 선언된 범위(스코프) 안에서만 유효하며,
서로 다른 타입 간 대입에는 형변환이 필요하다. 이번 글에서는 이 두 개념을 정리한다.
{} 블록 안에서만 유효하다. 해당 블록을 벗어나면 변수는 제거되고 접근할 수 없다.public static void main(String[] args) {
int m = 10; // main 전체에서 유효
if (true) {
int x = 20; // if 블록 내부에서만 유효
System.out.println(m); // 가능
System.out.println(x); // 가능
}
// System.out.println(x); // 오류: x는 스코프 밖
System.out.println(m); // 가능
}
for (int i = 0; i < 3; i++) {
System.out.println(i); // 가능
}
// System.out.println(i); // 오류: i는 for문 밖
변수는 꼭 필요한 범위 내에서만 사용하는 것이 좋다.
int temp = 0;
if (m > 0) {
temp = m * 2;
}
if (m > 0) {
int temp = m * 2;
}
int intValue = 10;
long longValue = intValue;
double doubleValue = intValue;
int → long → double 은 값의 손실이 없기 때문에 자동으로 변환된다..class 파일에는 해당 형변환 정보가 명확하게 기록된다.즉, 자바 컴파일러가 소스 코드를 바이트코드로 변환할 때 형변환을 JVM이 인식할 수 있도록 명확하게 삽입한다.
double d = 1.5;
int i = (int) d; // 소수점 버려짐 → i = 1
형변환을 할 때 만약 작은 숫자가 표현할 수 있는 범위를 넘어서면 어떻게 될까?
long big = 2147483648L; // int 최대값 초과
int small = (int) big;
System.out.println(small); // 출력: -2147483648
오버플로우는 눈에 보이지 않고, 경고 없이 발생하기 때문에 항상 주의해야 한다!
int div1 = 3 / 2;
System.out.println("div1 = " + div1); //1
double div2 = 3 / 2;
System.out.println("div2 = " + div2); //1.0
double div3 = 3.0 / 2;
System.out.println("div3 = " + div3); //1.5
double div4 = (double) 3 / 2;
System.out.println("div4 = " + div4); //1.5
int a = 3;
int b = 2;
double result = (double) a / b;
System.out.println("result = " + result); //1.5
| 구분 | 설명 | 예시 |
|---|---|---|
| 자동 형변환 | 작은 타입 → 큰 타입, 문제 없음 | int → long → double |
| 명시적 형변환 | 큰 타입 → 작은 타입, 개발자 책임 | (int) 1.5 → 1 (소수 손실) |
작은 컵에서 큰 컵은 OK, 큰 컵에서 작은 컵은 흘러넘칠 수 있다!