java 입문(5) 스코프, 형변환
변수는 선언한 위치에 따라 지역변수, 멤버 변수(클래스, 인스턴스)로 분류된다.
지금까지 사용한 변수들을 지역변수라고 하며, 특정 지역에서만 사용 가능한 변수이다. 그 범위는 변수가 선언된 코드 블록 내부 {}이다. 자신이 선언된 코드 블록을 벗어나면 제거되기에 이후에는 접근할 수가 없다.
public class ScopeExample {
public static void main(String[] args) {
int localVar = 10; // main 함수 내부의 지역 변수
if (localVar == 10) {
int innerVar = 5; // if 블록 내부의 지역 변수
}
// System.out.println(innerVar); // innerVar는 if 블록 외부에서 접근 불가 (컴파일 에러)
}
}
if, for, while 등, 각각의 기능들마다 내부 변수들의 scope 가 다르다. if와 for의 경우 {} 코드 블록 안에서만 변수가 사용 가능하다. while의 경우 시작 변수를 스코프 외부에 선언해야 하여 경우가 다르다.
이러한 범위가 존재하는 이유는 크게 두 가지인데, 바로 효율적인 메모리 사용 및 코드 간결화를 위해서이다.
public class ScopeExample {
int instanceVar = 20; // 멤버 변수 (인스턴스 변수)
public void exampleMethod() {
int localVar = 30; // 지역 변수
}
}
정리하자면, 변수는 필요한 범위에 한정해서 사용하는것이 좋다. 또한 좋은 프로그램은 무한한 자유가 있는 프로그램보다는 적절한 제약이 있는 프로그램이라고 한다.
형변환은 자동형변환과 수동형 변환 두 가지 방법이 존재한다.
int smallNum = 5;
double bigNum = smallNum; // int를 double로 암시적 형변환
double bigNum = 10.5;
int smallNum = (int) bigNum; // double을 int로 명시적 형변환
이러한 변환과정에서 가장 중요한 것은, 변환되는 형의 범위의 차이를 아는 것이다.
예를 들어, int->long->double 형변환은 작은 범위에서 큰 범위로 넘어가는 것은 변수의 값 자체가 변경될 필요가 없기에 자동으로 변환을 해주지만, 반대의 경우 값이 손실되는 문제가 발생할 수 있어 직접 형변환을 명시해야 적용된다고 한다.
값이 손실되는 여러 문제들 중, overflow는 그중 한 문제이다. 그 값이 범위를 초과하여 표현하려 했기에 나타나는 현상이며, 보통 발생하면 가장 처음(작은) 값을 가지게 된다.
int intValue = 2147483647; // int의 최댓값
intValue = intValue + 1; // Overflow 발생, intValue는 최솟값이 됨
연산을 하는데 있어 형변환이 발생하는 경우도 있는데, 같은 타입은 같은 결과를 내며, 서로 다른 타입의 계산은 큰 스코프로 자동 형변환이 발생한다.
public class TypeConversionExample {
public static void main(String[] args) {
int intValue = 5;
double doubleValue = 10.5;
// 다른 타입 간의 연산
double result1 = intValue + doubleValue; // int를 double로 자동 형변환
System.out.println("Result 1: " + result1);
// 서로 같은 타입 간의 연산
int result2 = (int) (intValue + doubleValue); // double을 int로 명시적 형변환
System.out.println("Result 2: " + result2);
}
}