본문 바로가기

프로그래밍 언어/Java

Java에서 변수 사용 시 흔히 하는 실수와 해결 방법

Java에서 변수 사용 시 흔히 하는 실수와 해결 방법

Java는 강력한 형식의 언어이지만, 초보자뿐만 아니라 경험이 많은 개발자도 변수 사용과 관련된 실수를 저지를 수 있습니다. 이 글에서는 Java에서 변수를 사용할 때 자주 발생하는 실수와 이를 해결하는 방법을 깊이 있게 살펴보겠습니다.

 

 

목차

  1. 초기화되지 않은 변수 사용
  2. 데이터 타입 불일치
  3. NullPointerException 발생
  4. 변수의 유효 범위(Scope) 문제
  5. final 변수 값 변경 시도
  6. 부동 소수점 정밀도 오류
  7. 변수 섀도잉(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 출력