지역 변수는 이름 그대로 특정 지역에서만 사용할 수 있는 변수라는 뜻이다. 그 특정 지역을 벗어나면 사용할 수 없다. 여기서 말하는 지역이 바로 변수가 선언된 코드 블록(
{}
)이다. 지역 변수는 자신이 선언된 코드 블록({}
) 안에서만 생존하고, 자신이 선언된 코드 블록을 벗어나면 제거된다.
스코프란 변수가 접근 가능한 범위이고, 지역 변수는 본인의 코드 블록 안에서만 생존한다.
하지만 자시느이 코드 블록을 벗어나면 제거되기 때문에 접근할 수 없다.
package scope;
public class Scope3_1 {
public static void main(String[] args) {
int m =10;
int temp =0;
if(m>0){
temp= m+2;
System.out.println("temp =" + temp);
}
System.out.println("m = " + m);
}
}
위의 코드는 좋은 예라고 할 수 없다. temp 변수는 if문 안에서만 사용이 되는데 전역으로 설정하게 되면 사용범위가 넓어지기 때문이다.
비효율적인 메모리 사용
:temp
는 if
코드 블록에서만 필요하지만, main()
코드 블록이 종료될 때 까지 메모리에 유지된다. 따라서 불필요한 메모리가 낭비된다. 만약 if
코드 블록 안에 temp
를 선언했다면 자바를 구현하는곳에서 if
코드 블록의 종료 시점에 이 변수를 메모리에서 제거해서 더 효율적으로 메모리를 사용할 수 있다.
코드 복잡성 증가
: 좋은 코드는 군더더기 없는 단순한 코드이다. temp
는 if
코드 블록에서만 필요하고, 여기서만 사용하면 된다. 만약 if
코드 블록 안에 temp
를 선언했다면 if
가 끝나고 나면temp
를 전혀 생각하지 않아도 된다. 머리 속에서 생각할 변수를 하나 줄일 수 있다. 그런데 지금 작성한 코드는 if
코드 블록이 끝나도main()
어디서나 temp
를 여전히 접근할 수 있다. 누군가 이 코드를 유지보수 할 때 m
은 물론이고 temp
까지 계속 신경써야 한다. 스코프가 불필요하게 넓은 것이다. 지금은 코드가 매우 단순해서 이해하는데 어려움이 없겠 지만 실무에서는 코드가 매우 복잡한 경우가 많다.
자바는 기본적으로 같은 타입에만 값을 대입할 수 있다.
- 작은 범위에서 큰 범위로는 당연히 값을 넣을 수 있다.
-- 예)int
long
double
- 큰 범위에서 작은 범위는 다음과 같은 문제가 발생할 수 있다.
-- 소수점 버림 오버플로우
하지만 결국 대입하는 형(타입)을 맞추어야 하기 때문에 개념적으로는 다음과 같이 동작한다.
//intValue = 10 doubleValue = intValue doubleValue = (double) intValue //형 맞추기 doubleValue = (double) 10 //변수 값 읽기 doubleValue = 10.0 //형변환
이렇게 앞에
(double)
과 같이 적어주면int
형이double
형으로 형이 변한다. 이렇게 형이 변경되는 것을 형변환 이라 한다.
작은 범위 숫자 타입에서 큰 범위 숫자 타입으로의 대입은 개발자가 이렇게 직접 형변환을 하지 않아도 된다. 이런 과정 이 자동으로 일어나기 때문에 자동 형변환, 또는 묵시적 형변환이라 한다.
큰 범위에서 작은 범위 대입은 명시적 형변환이 필요하다
java: incompatible types: possible lossy conversion from double to int
라는 오류 발생
직접 (int) 형을 넣어주면서 형변환을 할 수 있지만 이 경우 숫자가 손실되는 문제가 발생할 수 있다.
하지만 만약 이런 위험을 개발자가 직접 감수하고도 값을 대입하고 싶다면 데이터 타입을 강제로 변경할 수 있다.
이것을 형(타입)을 바꾼다고 해서 형변환이라 한다. 영어로는 캐스팅이라 한다. 그리고 개발자가 직접 형변환 코드를 입 력한다고 해서 명시적 형변환이라 한다.
형변환을 할 때 작은 숫자가 표현할 수 있는 범위를 넘어서게 됐을 때 발생하는 문제
int
형은 2147483647L까지 표현할 수 있기 때문에2147483648L
를 표현할 수 있는 방법이 없다. 이렇게 기존 범위를 초과해서 표현하게 되면 전혀 다른 숫자가 표현되는데, 이런 현상을 오버플로우라 한다.
- 보통 오버플로우가 발생하면 마치 시계가 한바퀴 돈 것 처럼 다시 처음부터 시작한다.
- 중요한 것은 오버플로우가 발생하는 것 자체가 문제. 오버플로우가 발생했을 때 결과가 어떻게 되는지 계산하는데 시간을 쓰지 말고 오버플로우 자체가 발생하지 않도록 막아야 한다. 이 경우 단순히 대입하는 변수(
intValue
)의타입을int
long
으로 변경해서 사이즈를 늘리면 오버플로우 문제가 해결된다.
int
+ int
는 int
를, double
+ double
은 double
의 결과가 나온다.int
+ long
은 long
+ long
으로 자동 형변환이 일어난다.int
+ double
은 double
+ double
로 자동 형변환이 일어난다.