Java 에서 숫자가 0 인지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 숫자가 0 인지 확인하는 방법을 배우게 됩니다. 이 기본적인 기술은 조건문을 사용하여 프로그램 흐름을 제어하는 데 매우 중요합니다. 먼저, 정수 값을 0 과 비교하기 위해 동등 연산자 (==) 를 사용하는 방법을 살펴보겠습니다.

그 다음, 정밀도 문제로 인해 부동 소수점 숫자와 0 을 처리할 때의 특정 고려 사항과 잠재적인 함정에 대해 다룰 것입니다. 마지막으로, Java 의 기본형 래퍼 클래스 (wrapper classes) 를 사용하여 0 검사를 수행하는 방법을 살펴보겠습니다.

동등성 연산자를 사용하여 0 확인

이 단계에서는 동등 연산자를 사용하여 Java 에서 숫자가 0 과 같은지 확인하는 방법을 살펴보겠습니다. 이는 프로그래밍의 기본적인 연산으로, 프로그램의 흐름을 제어하기 위해 조건문에서 자주 사용됩니다.

Java 에서 동등 연산자는 ==로 표시됩니다. 이는 두 값을 비교하는 데 사용되며, 두 값이 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

이를 시연하기 위해 간단한 Java 프로그램을 만들어 보겠습니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다 (아직 열려 있지 않은 경우).

  2. 파일의 전체 내용을 다음 코드로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            int number = 0;
    
            if (number == 0) {
                System.out.println("The number is zero.");
            } else {
                System.out.println("The number is not zero.");
            }
        }
    }

    이 새로운 코드를 분석해 보겠습니다.

    • int number = 0;: 이 줄은 number라는 정수 변수를 선언하고 값을 0으로 초기화합니다.
    • if (number == 0): 이것은 코드에서 결정을 내리는 데 사용되는 if 문입니다. 괄호 안의 조건 (number == 0)number 변수의 값이 0과 같은지 확인합니다.
    • System.out.println("The number is zero.");: 이 줄은 조건 number == 0true인 경우에만 실행됩니다.
    • else: 이 키워드는 if 조건이 false인 경우 실행될 코드 블록을 소개합니다.
    • System.out.println("The number is not zero.");: 이 줄은 조건 number == 0false인 경우에만 실행됩니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 이제 수정된 프로그램을 컴파일해 보겠습니다. 터미널에서 ~/project 디렉토리에 있는지 확인합니다. 필요한 경우 cd ~/project를 사용할 수 있습니다. 그런 다음 다음을 실행합니다.

    javac HelloJava.java

    컴파일이 성공하면 아무런 출력도 표시되지 않습니다.

  5. 마지막으로, 프로그램을 실행해 보겠습니다.

    java HelloJava

    다음 출력을 볼 수 있습니다.

    The number is zero.

    이는 프로그램이 == 연산자를 사용하여 number 변수가 0 과 같은지 정확하게 확인했음을 확인합니다.

이제 number 변수의 값을 0 이 아닌 값 (예: int number = 5;) 으로 변경하고, 파일을 저장하고, 다시 컴파일하고, 프로그램을 다시 실행하여 다른 출력을 확인해 보십시오.

부동 소수점 정밀도 처리

이 단계에서는 프로그래밍에서 부동 소수점 숫자 (소수점이 있는 숫자) 를 사용할 때 발생하는 일반적인 문제인 정밀도에 대해 알아보겠습니다. 컴퓨터가 이러한 숫자를 저장하는 방식 때문에 ==를 사용한 직접적인 동등성 비교는 때때로 예상치 못한 결과를 초래할 수 있습니다.

이를 실제로 살펴보겠습니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다.

  2. 기존 코드를 다음으로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            double num1 = 0.1 + 0.2;
            double num2 = 0.3;
    
            System.out.println("num1: " + num1);
            System.out.println("num2: " + num2);
    
            if (num1 == num2) {
                System.out.println("num1 is equal to num2.");
            } else {
                System.out.println("num1 is not equal to num2.");
            }
        }
    }

    이 코드에서:

    • 두 개의 double 변수 num1num2를 선언합니다. double은 부동 소수점 숫자를 저장하는 데 사용되는 Java 의 데이터 유형입니다.
    • num10.1 + 0.2를 할당하고 num20.3을 할당합니다. 수학적으로 이들은 같아야 합니다.
    • num1num2의 값을 출력하여 정확한 표현을 확인합니다.
    • == 연산자를 사용하여 num1num2와 같은지 확인합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 터미널에서 프로그램을 컴파일합니다.

    javac HelloJava.java
  5. 컴파일된 프로그램을 실행합니다.

    java HelloJava

    출력 결과에 놀랄 수도 있습니다.

    num1: 0.30000000000000004
    num2: 0.3
    num1 is not equal to num2.

    보시다시피, 부동 소수점 숫자가 저장되는 방식 때문에 num1은 정확히 0.3이 아닙니다. 이는 일반적인 문제이며, ==를 사용하여 부동 소수점 숫자의 동등성을 직접 비교하는 것이 일반적으로 권장되지 않는 이유입니다.

이를 처리하기 위해, 정확한 동등성을 확인하는 대신, 두 숫자 간의 절대 차이가 매우 작은 허용 오차 (종종 "epsilon"이라고 함) 내에 있는지 확인합니다.

이 방식을 사용하도록 코드를 수정해 보겠습니다.

  1. HelloJava.java를 다시 엽니다.

  2. if 문을 다음으로 바꿉니다.

    double epsilon = 0.000001; // A small tolerance
    
    if (Math.abs(num1 - num2) < epsilon) {
        System.out.println("num1 is approximately equal to num2.");
    } else {
        System.out.println("num1 is not approximately equal to num2.");
    }

    여기에서:

    • 작은 epsilon 값을 정의합니다.
    • Math.abs(num1 - num2)num1num2 간의 절대 차이를 계산합니다.
    • 이 절대 차이가 epsilon보다 작은지 확인합니다.
  3. 파일을 저장합니다.

  4. 프로그램을 컴파일합니다.

    javac HelloJava.java
  5. 프로그램을 실행합니다.

    java HelloJava

    이제 출력은 다음과 같아야 합니다.

    num1: 0.30000000000000004
    num2: 0.3
    num1 is approximately equal to num2.

    이는 정밀도 제한을 고려하여 실질적인 동등성을 위해 부동 소수점 숫자를 비교하는 올바른 방법을 보여줍니다.

Wrapper 클래스를 사용한 테스트

이 단계에서는 Java 의 래퍼 클래스 (wrapper class) 에서 동등성이 어떻게 작동하는지 살펴보겠습니다. 래퍼 클래스는 int, double, boolean과 같은 기본 데이터 유형을 객체로 사용할 수 있도록 하는 특수한 클래스입니다. 예를 들어, int의 래퍼 클래스는 Integer이고, double의 래퍼 클래스는 Double입니다.

Java 에서 객체를 비교할 때 == 연산자는 두 변수가 메모리에서 정확히 동일한 객체를 참조하는지 확인하며, 값의 동등성을 확인하지 않습니다. 객체의 을 비교하려면 equals() 메서드를 사용해야 합니다.

이것이 래퍼 클래스에 어떻게 적용되는지 살펴보겠습니다.

  1. WebIDE 편집기에서 HelloJava.java 파일을 엽니다.

  2. 기존 코드를 다음으로 바꿉니다.

    public class HelloJava {
        public static void main(String[] args) {
            Integer intObj1 = new Integer(100);
            Integer intObj2 = new Integer(100);
            Integer intObj3 = intObj1; // intObj3 refers to the same object as intObj1
    
            System.out.println("Comparing Integer objects with ==:");
            if (intObj1 == intObj2) {
                System.out.println("intObj1 == intObj2 is true");
            } else {
                System.out.println("intObj1 == intObj2 is false");
            }
    
            if (intObj1 == intObj3) {
                System.out.println("intObj1 == intObj3 is true");
            } else {
                System.out.println("intObj1 == intObj3 is false");
            }
    
            System.out.println("\nComparing Integer objects with equals():");
            if (intObj1.equals(intObj2)) {
                System.out.println("intObj1.equals(intObj2) is true");
            } else {
                System.out.println("intObj1.equals(intObj2) is false");
            }
    
            if (intObj1.equals(intObj3)) {
                System.out.println("intObj1.equals(intObj3) is true");
            } else {
                System.out.println("intObj1.equals(intObj3) is false");
            }
        }
    }

    이 코드에서:

    • new Integer()를 사용하여 동일한 값 (100) 을 가진 두 개의 Integer 객체 intObj1intObj2를 생성합니다. 이렇게 하면 메모리에 두 개의 별도 객체가 생성됩니다.
    • intObj3을 생성하고 intObj1을 할당합니다. 즉, intObj3intObj1은 이제 메모리에서 동일한 객체를 가리킵니다.
    • ==를 사용하여 intObj1intObj2intObj3과 비교합니다.
    • equals() 메서드를 사용하여 intObj1intObj2intObj3과 비교합니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

  4. 터미널에서 프로그램을 컴파일합니다.

    javac HelloJava.java
  5. 컴파일된 프로그램을 실행합니다.

    java HelloJava

    출력 결과는 다음과 같아야 합니다.

    Comparing Integer objects with ==:
    intObj1 == intObj2 is false
    intObj1 == intObj3 is true
    
    Comparing Integer objects with equals():
    intObj1.equals(intObj2) is true
    intObj1.equals(intObj3) is true

    이 출력은 차이점을 명확하게 보여줍니다.

    • intObj1 == intObj2false입니다. 왜냐하면 값은 같지만 메모리에서 서로 다른 객체이기 때문입니다.
    • intObj1 == intObj3true입니다. 왜냐하면 정확히 동일한 객체를 참조하기 때문입니다.
    • intObj1.equals(intObj2)true입니다. 왜냐하면 equals() 메서드는 객체의 을 비교하고, 두 값 모두 100 이기 때문입니다.
    • intObj1.equals(intObj3)true입니다. 왜냐하면 동일한 객체를 참조하고, 값도 같기 때문입니다.

    중요 참고 사항: 작은 정수 값 (일반적으로 -128 에서 127 까지) 의 경우 Java 는 Integer 객체에 대한 캐시를 사용합니다. 즉, Integer intObjA = 50; Integer intObjB = 50;intObjA == intObjBtrue가 될 수 있습니다. 왜냐하면 동일한 캐시된 객체를 참조할 수 있기 때문입니다. 그러나 동등성 검사에 이 캐싱 동작을 사용하는 것은 권장되지 않습니다. 항상 equals() 메서드를 사용하여 래퍼 클래스 객체의 값을 비교하십시오.

이 단계는 Java 에서 기본 유형과 객체를 비교하는 것의 중요한 차이점과 객체 값 비교에 equals() 메서드를 사용하는 것의 중요성을 강조합니다.

요약

이 Lab 에서는 Java 에서 숫자가 0 인지 확인하는 방법을 배웠습니다. 먼저, if 문 내에서 정수 변수를 0 과 비교하기 위해 기본적인 동등성 연산자 (==) 를 사용했습니다. 이는 숫자 동등성을 기반으로 하는 조건부 검사의 기본 원리를 보여주었습니다.

그런 다음 부동 소수점 숫자를 처리하는 뉘앙스와 ==를 사용하여 직접 0 과 비교할 때 발생하는 잠재적인 정밀도 문제를 살펴보았습니다. 마지막으로, Java 의 래퍼 클래스를 사용하여 0 검사를 수행하는 방법을 검토하고, 기본 기본 값을 액세스하고 비교하는 방법을 이해했습니다.