[JAVA] 입력 받은 숫자가 소수인지 판단하는 문제 뜯어보기

2023. 4. 6. 00:41·개발/JAVA
728x90
반응형

입력받은 숫자가 소수인지 아닌지 판별하는 문제를 통해 배운게 꽤 많아서 정리하려고 한다.

첫 번째 내가 푼 풀이이다.

import java.util.Scanner;

public class FindPrimeNumberRunner {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("Input any number!");
		boolean isPrime = true;
		int number = input.nextInt();
		for (int i = 2; i < Math.sqrt(number); i++) {
			if (number % i == 0) {
				isPrime = false;
			}
		}
		System.out.println(number + " is %s Prime Number"
				.formatted(isPrime ? "" : "not"));
	}

}

인풋을 입력받기 위해 Scanner 클래스를 사용했다.

System.in 을 통해 console 창에서 사용자로부터 콘솔을 입력받을 수 있다고 한다.

생성된 Scanner 객체의 메소드인 nextInt를 통해 공백이 오기전 int를 받아올 수 있다.

nextLine, nextDouble 등의 메소드가 있다고 한다.

 

다음은 리팩터링을 하여 메소드를 만들어 코드를 나누고 소수가 되는 조건을 수정했다.

import java.util.Scanner;

public class FindPrimeNumberRunner {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("Input any number!");
		int number = input.nextInt();
		boolean isPrime = isPrimeNumber(number);
		
		System.out.println(number + " is %s Prime Number"
				.formatted(isPrime ? "" : "not"));
	}
	
	static boolean isPrimeNumber(int number) {
		if(number < 2) return false;
		for (int i = 2; i <= Math.sqrt(number); i++) {
			if (number % i == 0) {
				return false;
			}
		}
		return true;
	}
}

아래는 GPT가 해준 리팩터링이다.

import java.util.InputMismatchException;
import java.util.Scanner;

public class PrimeNumberFinder {

    public static void main(String[] args) {
        try (Scanner inputScanner = new Scanner(System.in)) {
            System.out.println("Enter a number:");
            int inputNumber = 0;
            boolean isValidInput = false;
            
            while (!isValidInput) {
                try {
                    inputNumber = inputScanner.nextInt();
                    isValidInput = true;
                } catch (InputMismatchException e) {
                    System.out.println("Invalid input. Please enter a number:");
                    inputScanner.nextLine(); // Clear invalid input
                }
            }
            
            boolean isPrime = isPrime(inputNumber);
            System.out.println(inputNumber + " is " + (isPrime ? "a" : "not a") + " prime number.");
        }
    }

    static boolean isPrime(int number) {
        if (number < 2) {
            return false;
        }
        for (int i = 2; i <= Math.sqrt(number); i++) {
            if (number % i == 0) {
                return false;
            }
        }
        return true;
    }
}

FindPrimeNumberRunner-> PrimeNumberFinder, input -> inputScanner, number -> inputNumber 와 같이 네이밍을 확실하게 리팩터링했다.

그리고 try 문을 사용해서 Scanner 객체가 필요하지 않을때 자동으로 종료해줘 메모리 누수를 막는다고 한다.

try(Scanner inputScanner = new Scanner(System.in)){}

이처럼 try 괄호에 객체를 생성해 주면 해당 리소스가 AutoCloseable 인터페이스가 구현되있는 리소스인 경우에 try문을 빠져나갈때 자동으로 해당 리소스의 close() 메소드를 호출해 준다고 한다.

이를 try-with-resources라고 한다.

 

close() 메소드를 찾아보면 아래와 같이 되어있다.

public void close() {
        if (closed)
            return;
        if (source instanceof Closeable) {
            try {
                ((Closeable)source).close();
            } catch (IOException ioe) {
                lastException = ioe;
            }
        }
        sourceClosed = true;
        source = null;
        closed = true;
}

close() 가 실행되면 source를 닫은 다음 비워주고, closed = true로 만들면서 객체를 닫아버린다.

Closeable을 타고 들어가보면 AutoCloseable 인터페이스를 extends 하고 있다는 것을 알수 있다.

AutoCloseable 인터페이스를 구현하면 try-with-resources를 사용할 수 있다고 한다.

 

마지막으로 InputMismatchException을 통해서 int가 아닌 값을 입력받았을때 int값을 입력받을 때까지 while문을 돌며  반복한다.

 

728x90
반응형

'개발 > JAVA' 카테고리의 다른 글

[Java] 필드 주입시 생성자에 this 꼭 써야할까?  (0) 2023.06.05
[Java] @Override 꼭 적어야 하나?  (0) 2023.05.04
[Java] 인터페이스가 가진 객체지향의 특징  (0) 2023.05.03
[Java] List<T> list = new ArrayList<>();  (0) 2023.04.25
[JAVA] java 기본개념 (+ jshell)  (0) 2023.04.04
'개발/JAVA' 카테고리의 다른 글
  • [Java] @Override 꼭 적어야 하나?
  • [Java] 인터페이스가 가진 객체지향의 특징
  • [Java] List<T> list = new ArrayList<>();
  • [JAVA] java 기본개념 (+ jshell)
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    go
    30일 챌린지
    js
    erc20
    ERC721
    node
    mysql
    프로그래머스
    하이퍼레저
    컨테이너
    go언어
    30일챌린지
    React
    nodejs
    도커
    node.js
    html
    명령어
    CSS
    블록체인
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[JAVA] 입력 받은 숫자가 소수인지 판단하는 문제 뜯어보기
상단으로

티스토리툴바