Java 에서 숫자가 완전 제곱수인지 확인하는 방법

JavaBeginner
지금 연습하기

소개

이 랩에서는 Java 에서 주어진 정수가 완전 제곱수인지 확인하는 방법을 배우게 됩니다. Math.sqrt() 메서드를 사용하여 숫자의 제곱근을 계산하고, 그 결과가 정수인지 확인하는 방법을 살펴볼 것입니다.

실습 코딩 연습을 통해 사용자 입력을 받고, 제곱근을 계산하며, 원래 숫자가 완전 제곱수인지 판별하는 Java 프로그램을 구현할 것입니다. 또한 프로그램의 견고성을 보장하기 위해 음수와 완전 제곱수가 아닌 숫자 등 다양한 입력으로 프로그램을 테스트할 것입니다.

제곱근 계산 및 정수 확인

이 단계에서는 숫자의 제곱근을 계산하고 원래 숫자가 완전 제곱수인지 확인하는 Java 프로그램을 작성합니다. 완전 제곱수는 정수의 제곱인 정수입니다. 즉, 정수를 자기 자신과 곱한 결과입니다. 예를 들어, 9 는 3 * 3 이므로 완전 제곱수입니다.

Java 에서 제공하는 Math.sqrt() 메서드를 사용하여 제곱근을 계산합니다. 이 메서드는 소수점이 있을 수 있는 double 값을 반환합니다. 원래 숫자가 완전 제곱수인지 확인하려면 제곱근이 정수인지 확인해야 합니다.

  1. 먼저, ~/project 디렉토리에 SquareRootChecker.java라는 새 Java 파일을 만듭니다. 왼쪽의 파일 탐색기에서 마우스 오른쪽 버튼을 클릭하고 "새 파일"을 선택한 다음 SquareRootChecker.java를 입력하여 이 작업을 수행할 수 있습니다.

  2. 편집기에서 SquareRootChecker.java 파일을 열고 다음 코드를 붙여넣습니다.

    import java.util.Scanner;
    
    public class SquareRootChecker {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.print("Enter an integer: ");
            int number = scanner.nextInt();
    
            if (number < 0) {
                System.out.println("Cannot calculate the square root of a negative number.");
            } else {
                double squareRoot = Math.sqrt(number);
    
                // Check if the square root is an integer
                if (squareRoot == Math.floor(squareRoot)) {
                    System.out.println(number + " is a perfect square.");
                } else {
                    System.out.println(number + " is not a perfect square.");
                }
            }
    
            scanner.close();
        }
    }

    이 코드의 새로운 부분을 살펴보겠습니다.

    • import java.util.Scanner;: 사용자 입력을 읽기 위해 Scanner 클래스를 다시 가져옵니다.
    • System.out.print("Enter an integer: ");: 사용자에게 숫자를 입력하라는 메시지를 표시합니다.
    • int number = scanner.nextInt();: 사용자가 입력한 정수를 읽어 number 변수에 저장합니다.
    • if (number < 0): 입력된 숫자가 음수인지 확인하는 if 문입니다. 음수이면 오류 메시지를 출력합니다.
    • double squareRoot = Math.sqrt(number);: 이 줄은 Math.sqrt() 메서드를 사용하여 number의 제곱근을 계산하고 결과를 squareRoot라는 double 변수에 저장합니다.
    • if (squareRoot == Math.floor(squareRoot)): 제곱근이 정수인지 확인하는 핵심 로직입니다. Math.floor(squareRoot)squareRoot보다 작거나 같은 가장 큰 정수를 반환합니다. squareRoot가 정수이면 squareRootMath.floor(squareRoot)가 같습니다.
    • System.out.println(...): 숫자가 완전 제곱수인지 여부에 따라 결과를 출력하는 줄입니다.
  3. 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).

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

    javac SquareRootChecker.java

    오류가 없으면 SquareRootChecker.class 파일이 생성됩니다.

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

    java SquareRootChecker
  6. 프로그램은 정수를 입력하라는 메시지를 표시합니다. 9와 같은 숫자를 입력하고 Enter 키를 누릅니다. 9 가 완전 제곱수임을 나타내는 출력이 표시됩니다. 프로그램을 다시 실행하고 10과 같은 숫자를 입력합니다. 10 이 완전 제곱수가 아님을 나타내는 출력이 표시됩니다.

    Enter an integer: 9
    9 is a perfect square.
    Enter an integer: 10
    10 is not a perfect square.

제곱근을 계산하고 숫자가 완전 제곱수인지 확인하는 Java 프로그램을 성공적으로 작성했습니다!

완전 제곱수 확인을 위한 Math.sqrt() 사용

이 단계에서는 Math.sqrt()가 어떻게 작동하는지, 그리고 이전 단계에서 숫자가 완전 제곱수인지 확인하기 위해 어떻게 사용했는지 이해하는 데 집중할 것입니다.

Math.sqrt() 메서드는 많은 수학 함수를 제공하는 Java 의 내장 Math 클래스의 일부입니다. Math.sqrt(double a)doublea를 입력으로 받아 제곱근을 double로 반환합니다.

예를 들어:

  • Math.sqrt(9.0)3.0을 반환합니다.
  • Math.sqrt(10.0)는 대략 3.1622776601683795를 반환합니다.
  • Math.sqrt(0.0)0.0을 반환합니다.
  • Math.sqrt(-9.0)NaN (Not a Number) 을 반환합니다.

SquareRootChecker.java 프로그램에서 사용자로부터 정수를 읽지만, Math.sqrt()double을 예상합니다. int numberMath.sqrt()에 전달하면 Java 는 자동으로 int numberdouble로 변환합니다.

완전 제곱수를 확인하는 핵심은 계산된 제곱근 (double squareRoot) 을 해당 바닥 값 (Math.floor(squareRoot)) 과 비교하는 것입니다.

  • squareRoot가 정수 (예: 3.0) 인 경우 Math.floor(squareRoot)도 3.0 이 되며, 조건 squareRoot == Math.floor(squareRoot)는 참이 됩니다.
  • squareRoot에 소수 부분 (예: 3.16...) 이 있는 경우 Math.floor(squareRoot)는 3.0 이 되며, 조건 squareRoot == Math.floor(squareRoot)는 거짓이 됩니다.

이 간단한 비교를 통해 원래 정수가 완전 제곱수였는지 효과적으로 확인할 수 있습니다.

다양한 입력에 대한 출력을 관찰하고 이해를 굳히기 위해 프로그램을 몇 번 더 다시 실행해 보겠습니다.

  1. 터미널에서 ~/project 디렉토리에 있는지 확인합니다.

  2. 컴파일된 프로그램을 다시 실행합니다.

    java SquareRootChecker
  3. 숫자 25를 입력하고 Enter 키를 누릅니다. 출력을 관찰합니다.

    Enter an integer: 25
    25 is a perfect square.
  4. 프로그램을 다시 실행합니다.

    java SquareRootChecker
  5. 숫자 15를 입력하고 Enter 키를 누릅니다. 출력을 관찰합니다.

    Enter an integer: 15
    15 is not a perfect square.

다양한 입력으로 프로그램을 실행하여 Math.sqrt()Math.floor() 비교가 완전 제곱수를 어떻게 정확하게 식별하는지 확인할 수 있습니다.

음수 및 정수가 아닌 입력 테스트

이 단계에서는 SquareRootChecker.java 프로그램을 음수로 테스트하고 사용자가 정수가 아닌 것을 입력하는 경우 어떻게 되는지 고려합니다.

우리가 작성한 코드에는 음수에 대한 검사가 포함되어 있습니다.

if (number < 0) {
    System.out.println("Cannot calculate the square root of a negative number.");
}

if 문은 사용자가 음수 정수를 입력하는 경우를 처리합니다. 이 코드 부분을 테스트해 보겠습니다.

  1. 터미널에서 ~/project 디렉토리에 있는지 확인합니다.

  2. 컴파일된 프로그램을 실행합니다.

    java SquareRootChecker
  3. 메시지가 표시되면 음수, 예를 들어 -4를 입력하고 Enter 키를 누릅니다.

    Enter an integer: -4
    Cannot calculate the square root of a negative number.

    예상대로 프로그램은 음수의 제곱근을 계산할 수 없음을 정확하게 식별하고 적절한 메시지를 출력합니다.

이제 사용자가 텍스트 또는 소수와 같이 정수가 아닌 입력을 입력하는 경우 어떻게 되는지 고려해 보겠습니다. 우리 프로그램은 scanner.nextInt()를 사용하여 입력을 읽습니다. 이 메서드는 정수 값만 읽도록 설계되었습니다. 사용자가 정수로 구문 분석할 수 없는 것을 입력하면 InputMismatchException이 발생하고 프로그램이 충돌합니다.

이러한 오류를 적절하게 처리하는 것은 강력한 프로그램을 작성하는 중요한 부분입니다. 이 소개 랩에서는 정수가 아닌 입력에 대한 전체 오류 처리를 구현하지 않지만, 이러한 일이 발생할 수 있다는 것을 아는 것이 중요합니다. 향후 랩에서는 try-catch 블록과 같은 기술을 사용하여 예외를 처리하고 프로그램이 예상치 못한 사용자 입력에 더 잘 대처할 수 있도록 하는 방법을 배우게 됩니다.

지금은 정수가 아닌 입력을 입력할 때 어떻게 되는지 관찰해 보겠습니다.

  1. 컴파일된 프로그램을 다시 실행합니다.

    java SquareRootChecker
  2. 메시지가 표시되면 텍스트, 예를 들어 hello를 입력하고 Enter 키를 누릅니다.

    Enter an integer: hello
    Exception in thread "main" java.util.InputMismatchException
        at java.base/java.util.Scanner.throwFor(Scanner.java:939)
        at java.base/java.util.Scanner.next(Scanner.java:1594)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
        at SquareRootChecker.main(SquareRootChecker.java:9)

    InputMismatchException을 나타내는 오류 메시지가 표시됩니다. 이는 scanner.nextInt()가 정수를 예상했지만 "hello"를 받았기 때문입니다.

이 단계에서는 다양한 유형의 사용자 입력을 고려하고 프로그램이 이를 어떻게 처리할지 고려하는 것이 얼마나 중요한지 강조합니다. 현재 프로그램은 간단하지만 이러한 잠재적 문제를 이해하는 것은 더 복잡한 애플리케이션을 개발하는 데 매우 중요합니다.

요약

이 랩에서는 Java 에서 주어진 정수가 완전 제곱수인지 확인하는 방법을 배웠습니다. 입력 숫자의 제곱근을 계산하기 위해 Math.sqrt() 메서드를 활용했습니다.

핵심 로직은 계산된 제곱근이 Math.floor()를 사용하여 바닥 값과 비교하여 정수인지 확인하는 것이었습니다. 또한 제곱근이 실수 (real numbers) 가 아닌 음수 입력 숫자의 경우도 처리했습니다. 이 과정을 통해 완전 제곱수를 효과적으로 식별할 수 있었습니다.