이 게시글은 인프런 "김영한의 자바 입문" 강의를 바탕으로 작성했습니다:)
변수의 접근 가능한 범위를 스코프(Scope)라 한다. 참고로 Scope를 번역하면 범위라는 뜻
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);
}
}
조건이 맞으면 변수 m의 값을 2배 증가해서 출력하는 코드이다. 여기서 2배 증가한 값을 저장해두기 위해 임시 변수 temp를 사용했다.
그런데 이 코드는 좋은 코드라고 보기는 어렵다. 왜냐하면 임시 변수 temp는 if 조건이 만족할 때 임시로 잠깐 사용하는 변수이다. 그런데 임시 변수 temp 는main() 코드 블록에 선언되어 있다.
이렇게 되면 다음과 같은 문제가 발생한다
temp는 if 코드 블록에서만 필요하지만, main() 코드 블록이 종료될 때 까지 메모리에 유지된다. 따라서 불필요한 메모리가 낭비된다.if 코드 블록 안에 temp 를 선언했다면 자바를 구현하는 곳에서 if 코드 블록의 종료 시점에 이 변수를 메모리에서 제거해서 더 효율적으로 메모리를 사용할 수 있다.m은 물론이고 temp까지 계속 신경써야 한다. 스코프가 불필요하게 넓은 것이다.package scope;
public class Scope3_2 {
public static void main(String[] args) {
int m = 10;
if (m > 0) {
int temp = m * 2;
System.out.println("temp = " + temp);
}
System.out.println("m = " + m);
}
}
temp를 if코드 블록 안에서 선언했다. 이제 temp는 if 코드 블록 안으로 스코프가 줄어든다. 덕분에 temp 메모리를 빨리 제거해서 메모리를 효율적으로 사용하고, temp 변수를 생각해야 하는 범위를 줄여서 더 유지보수 하기 좋은 코드가 됐다.
예) int → long → double
작은 범위 숫자 타입에서 큰 범위 숫자 타입으로의 대입은 개발자가 직접 형변환을 하지 않아도 된다. 이런 과정이 자동으로 일어나기 때문에 자동 형변환, 또는 묵시적 형변환이라 한다.
큰 범위에서 작은 범위 대입은 명시적 형변환이 필요하다
형변환은 다음과 같이 변경하고 싶은 데이터 타입을 (int)와 같이 괄호를사용해서 명시적으로 입력하면 된다.
intValue = (int) doubleValue; //형변환
이것을 형(타입)을 바꾼다고 해서 형변환이라 한다. 영어로는 캐스팅이라 한다. 그리고 개발자가 직접 형변환 코드를 입력한다고 해서 명시적 형변환이라 한다.
int → long → double