Java에서 변수 사용 시 흔히 하는 실수와 해결 방법
Java는 강력한 형식의 언어이지만, 초보자뿐만 아니라 경험이 많은 개발자도 변수 사용과 관련된 실수를 저지를 수 있습니다. 이 글에서는 Java에서 변수를 사용할 때 자주 발생하는 실수와 이를 해결하는 방법을 깊이 있게 살펴보겠습니다.
목차
- 초기화되지 않은 변수 사용
- 데이터 타입 불일치
- NullPointerException 발생
- 변수의 유효 범위(Scope) 문제
- final 변수 값 변경 시도
- 부동 소수점 정밀도 오류
- 변수 섀도잉(Shadowing) 문제
초기화되지 않은 변수 사용
Java에서는 지역 변수(local variable)를 선언할 때 반드시 초기화해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
문제 코드
public class Example {
public static void main(String[] args) {
int x;
System.out.println(x); // 오류 발생: 초기화되지 않은 변수 사용
}
}
해결 방법
변수를 사용하기 전에 반드시 초기값을 지정해야 합니다.
int x = 0;
System.out.println(x); // 정상 작동
데이터 타입 불일치
Java는 정적 타입 언어이므로 서로 다른 데이터 타입 간의 변환이 자동으로 이루어지지 않는 경우가 많습니다.
문제 코드
int num = "100"; // 문자열을 정수형 변수에 할당하려고 하면 오류 발생
해결 방법
적절한 타입 변환을 수행해야 합니다.
int num = Integer.parseInt("100");
NullPointerException 발생
객체가 초기화되지 않은 상태에서 메서드를 호출하면 NullPointerException
이 발생할 수 있습니다.
문제 코드
String str = null;
System.out.println(str.length()); // NullPointerException 발생
해결 방법
- 변수가
null
인지 체크한 후 사용 - Optional을 활용하여 안전한 접근
if (str != null) {
System.out.println(str.length());
}
변수의 유효 범위(Scope) 문제
Java에서는 변수의 유효 범위(scope)를 잘못 설정하면 예기치 않은 오류가 발생할 수 있습니다.
문제 코드
public class Example {
public static void main(String[] args) {
if (true) {
int num = 10;
}
System.out.println(num); // 오류 발생: num의 유효 범위가 블록 내부
}
}
해결 방법
변수를 블록 밖에서 선언하여 범위를 조정합니다.
int num;
if (true) {
num = 10;
}
System.out.println(num); // 정상 작동
final 변수 값 변경 시도
final
키워드를 사용한 변수는 값을 변경할 수 없습니다.
문제 코드
final int MAX_VALUE = 100;
MAX_VALUE = 200; // 오류 발생: final 변수는 변경 불가
해결 방법
상수로 유지하려면 변경을 시도하지 않거나, 필요에 따라 static
을 활용할 수 있습니다.
부동 소수점 정밀도 오류
부동 소수점 연산에서는 정밀도 문제로 인해 정확한 결과를 보장하기 어렵습니다.
문제 코드
double a = 0.1;
double b = 0.2;
System.out.println(a + b); // 0.30000000000000004 출력
해결 방법
BigDecimal
을 사용하여 정밀한 계산을 수행합니다.
import java.math.BigDecimal;
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b)); // 정확한 0.3 출력
변수 섀도잉(Shadowing) 문제
지역 변수의 이름이 클래스 변수와 동일할 경우 혼동을 초래할 수 있습니다.
문제 코드
class Example {
int num = 5;
void printNum() {
int num = 10;
System.out.println(num); // 10 출력 (인스턴스 변수와 충돌)
}
}
해결 방법
this
키워드를 사용하여 클래스 변수를 명확하게 구분합니다.
System.out.println(this.num); // 5 출력
'프로그래밍 언어 > Java' 카테고리의 다른 글
Java boolean, 조건문과 플래그 활용의 기본 이해 (0) | 2025.03.05 |
---|---|
Java 데이터 타입의 세계, Primitive와 Reference 타입 비교 (0) | 2025.02.27 |
char 타입의 특징과 활용, Java 문자 데이터 다루기 (0) | 2025.02.15 |
boolean 타입으로 논리적 판단 구현하기, Java의 핵심 데이터 타입 (0) | 2025.02.09 |
Java 데이터 타입, Wrapper 클래스와의 연결 (0) | 2025.02.03 |