로컬변수 한글로 지역변수라 한다.
지역변수는 이름 그대로 특정 지역에서만 사용 할 수 있는 변수라는 뜻.
그 특정 지역을 벗어나면 사용할 수 없다.
여기서 말하는 지역이 바로 변수가 선언된 코드 블록({})이다.
자신이 선언된 코드블록 안에서만 생존하고, 자신이 선언된 코드 블록을 벗어나면 제거된다.
따라서 이후에는 접근 할 수 없다.
package scope;
public class Scope1 {
public static void main(String[] args) {
int m = 10; //m 생존 시작
if (true) {
int x = 20; //x 생존 시작
System.out.println("if m = " + m); //블록 내부에서 블록 외부는 접근 가능
System.out.println("if x = " + x);
} //x 생존 종료
//System.out.println("main x = " + x); //오류, 변수 x에 접근 불가
System.out.println("main m = " + m);
} //m 생존 종료
}
- int m
1. int m 은 main{} 의 코드 블록안에서 선언되었다. 변수를 선언한 시점부터 main{} 의 코드 블록이 종료될 때 까지 생존한다. 2. if{} 블록 내부에서도 외부 블록에서 선언된 m 에 접근할 수 있다. 쉽게 이야기해서 생존 범위만 맞으면 다 접근할 수 있다.
- int x
1. int x 는 if{} 블록안에서 선언되었다. 변수를 선언한 시점부터 if{} 의 코드 블록이 종료될 때까지 생존한다. 2. if{} 내부에서는 자신의 범위에서 선언한 x 에 당연히 접근할 수 있다. 3. if{} 코드 블록이 끝나버리면 x 는 제거된다. 따라서 더는 x 에 접근할 수 없다. 따라서 이후에 접근하면 cannot find symbol 이라는 변수 이름을 찾을 수 없다는 컴파일 오류가 발생한다.
변수의 접근 가능한 범위를 스코프(Scope) 라 한다. 참고로 Scope를 번역하면 범위라는 뜻이다.
형변환
- 작은 범위에서 큰 범위로는 당연히 값을 넣을 수 있다.
예) int ▶ long ▶ double- 큰 범위에서 작은 범위는 다음과 같은 문제가 발생할 수 있다.
1. 소수점 버림 2. 오버플로우
작은 범위에서 큰 범위로 대입은 허용한다
자바에서 숫자를 표현할 수 있는 범위는 다음과 같다.
int < long < double
int 보다는 long 이, long 보다는 double 이 더 큰 범위를 표현할 수 있다.
자동 형변환
결국 대입하는 형(타입)을 맞추어야 하기 때문에 개념적으로는 다음과 같이 동작한다.
//intValue = 10
doubleValue = intValue
doubleValue = (double) intValue //형 맞추기
doubleValue = (double) 10 //변수 값 읽기
doubleValue = 10.0 //형변환
이렇게 앞에 (double) 과 같이 적어주면 int 형이 double 형으로 형이 변한다.
이렇게 형이 변경되는 것을 형변환이라 한다.
작은 범위 숫자 타입에서 큰 범위 숫자 타입으로의 대입은 개발자가 이렇게 직접 형변환을 하지 않아도 된다. 이런 과정이 자동으로 일어나기 때문에 자동 형변환, 또는 묵시적 형변환이라 한다.
반대로 큰 범위에서 작은 범위로 대입하기
큰 범위에서 작은 범위 대입은 명시적 형변환이 필요하다.
intValue = (int) doubleValue; //형변환
명시적 형변환 과정
//doubleValue = 1.5
intValue = (int) doubleValue;
intValue = (int) 1.5; //doubleValue에 있는 값을 읽는다.
intValue = 1; //(int)로 형변환 한다. intValue에 int형인 숫자 1을 대입한다.
int ▶ long ▶ double
- 작은 범위에서 큰 범위로는 대입할 수 있다.
이것을 묵시적 형변환 또는 자동 형변환이라 한다.
- 큰 범위에서 작은 범위의 대입은 다음과 같은 문제가 발생할 수 있다. 이때는 명시적 형변환을 사용해야 한다.
소수점 버림 오버플로우
- 연산과 형변환
같은 타입은 같은 결과를 낸다. 서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.